java实现微信App支付服务端

微信App支付服务端的实现方法,供大家参考,具体内容如下

引言

主要实现app支付统一下单、异步通知、调起支付接口、支付订单查询、申请退款、查询退款功能;封装了https对发起退款的证书校验、签名、xml解析等。

支付流程

具体支付流程参考“微信APP”文档,文档地址

APP支付:APP端点击下单—-服务端生成订单,并调起“统一下单”,返回app支付所需参数—–APP端“调起支付接口“,发起支付—-微信服务器端调用服务端回调地址—–服务端按照“支付结果通知”,处理支付结果

app查询:调起“查询订单”

APP退款:发起退款请求,调用“申请退款”,发起退款,需双向证书验证

APP退款查询:调起“查询退款”

支付代码实现

代码实现签名、证书校验、http和https封装等,项目结构如下:

支付代码

包含支付、支付查询、异步通知、退款申请、退款查询

package org.andy.wxpay.controller;

import java.math.BigDecimal;
import java.util.HashMap;
import java.util.Map;

import javax.servlet.ServletInputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.andy.wxpay.model.JsonResult;
import org.andy.wxpay.model.ResponseData;
import org.andy.wxpay.utils.CollectionUtil;
import org.andy.wxpay.utils.ConfigUtil;
import org.andy.wxpay.utils.FileUtil;
import org.andy.wxpay.utils.HttpUtils;
import org.andy.wxpay.utils.PayUtil;
import org.andy.wxpay.utils.SerializerFeatureUtil;
import org.andy.wxpay.utils.StringUtil;
import org.andy.wxpay.utils.WebUtil;
import org.andy.wxpay.utils.XmlUtil;
import org.apache.log4j.Logger;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;

import com.alibaba.fastjson.JSON;

/**
 * 创建时间:2016年11月2日 下午4:16:32
 *
 * @author andy
 * @version 2.2
 */
@Controller
@RequestMapping("/order")
public class PayController {

 private static final Logger LOG = Logger.getLogger(PayController.class);

 private static final String ORDER_PAY = "https://api.mch.weixin.qq.com/pay/unifiedorder"; // 统一下单

 private static final String ORDER_PAY_QUERY = "https://api.mch.weixin.qq.com/pay/orderquery"; // 支付订单查询

 private static final String ORDER_REFUND = "https://api.mch.weixin.qq.com/secapi/pay/refund"; // 申请退款

 private static final String ORDER_REFUND_QUERY = "https://api.mch.weixin.qq.com/pay/refundquery"; // 申请退款

 private static final String APP_ID = ConfigUtil.getProperty("wx.appid");

 private static final String MCH_ID = ConfigUtil.getProperty("wx.mchid");

 private static final String API_SECRET = ConfigUtil.getProperty("wx.api.secret");

 /**
 * 支付下订单
 *
 * @param request
 * @param response
 * @param cashnum
 * 支付金额
 * @param mercid
 * 商品id
 * @param callback
 */
 @RequestMapping(value = "/pay", method = RequestMethod.POST)
 public void orderPay(HttpServletRequest request, HttpServletResponse response,
 @RequestParam(required = false, defaultValue = "0") Double cashnum, String mercid, String callback) {
 LOG.info("[/order/pay]");
 if (!"001".equals(mercid)) {
 WebUtil.response(response, WebUtil.packJsonp(callback, JSON
 .toJSONString(new JsonResult(-1, "商品不存在", new ResponseData()), SerializerFeatureUtil.FEATURES)));
 }

 Map<String, String> restmap = null;
 boolean flag = true; // 是否订单创建成功
 try {
 String total_fee = BigDecimal.valueOf(cashnum).multiply(BigDecimal.valueOf(100))
 .setScale(0, BigDecimal.ROUND_HALF_UP).toString();
 Map<String, String> parm = new HashMap<String, String>();
 parm.put("appid", APP_ID);
 parm.put("mch_id", MCH_ID);
 parm.put("device_info", "WEB");
 parm.put("nonce_str", PayUtil.getNonceStr());
 parm.put("body", "测试付费");
 parm.put("attach", "Andy");
 parm.put("out_trade_no", PayUtil.getTradeNo());
 parm.put("total_fee", total_fee);
 parm.put("spbill_create_ip", PayUtil.getRemoteAddrIp(request));
 parm.put("notify_url", "https://www.andy.org/wxpay/order/pay/notify.shtml");
 parm.put("trade_type", "APP");
 parm.put("sign", PayUtil.getSign(parm, API_SECRET));

 String restxml = HttpUtils.post(ORDER_PAY, XmlUtil.xmlFormat(parm, false));
 restmap = XmlUtil.xmlParse(restxml);
 } catch (Exception e) {
 LOG.error(e.getMessage(), e);
 }

 Map<String, String> payMap = new HashMap<String, String>();
 if (CollectionUtil.isNotEmpty(restmap) && "SUCCESS".equals(restmap.get("result_code"))) {
 payMap.put("appid", APP_ID);
 payMap.put("partnerid", MCH_ID);
 payMap.put("prepayid", restmap.get("prepay_id"));
 payMap.put("package", "Sign=WXPay");
 payMap.put("noncestr", PayUtil.getNonceStr());
 payMap.put("timestamp", PayUtil.payTimestamp());
 try {
 payMap.put("sign", PayUtil.getSign(payMap, API_SECRET));
 } catch (Exception e) {
 flag = false;
 }
 }

 if (flag) {
 WebUtil.response(response,
 WebUtil.packJsonp(callback,
 JSON.toJSONString(new JsonResult(1, "订单获取成功", new ResponseData(null, payMap)),
  SerializerFeatureUtil.FEATURES)));
 } else {
 if (CollectionUtil.isNotEmpty(restmap)) {
 LOG.info("订单创建失败:" + restmap.get("err_code") + ":" + restmap.get("err_code_des"));
 }
 WebUtil.response(response, WebUtil.packJsonp(callback, JSON
 .toJSONString(new JsonResult(-1, "订单获取失败", new ResponseData()), SerializerFeatureUtil.FEATURES)));
 }
 }

 /**
 * 查询支付结果
 *
 * @param request
 * @param response
 * @param tradeid 微信交易订单号
 * @param tradeno 商品订单号
 * @param callback
 */
 @RequestMapping(value = "/pay/query", method = RequestMethod.POST)
 public void orderPayQuery(HttpServletRequest request, HttpServletResponse response, String tradeid, String tradeno,
 String callback) {
 LOG.info("[/order/pay/query]");
 if (StringUtil.isEmpty(tradeno) && StringUtil.isEmpty(tradeid)) {
 WebUtil.response(response, WebUtil.packJsonp(callback, JSON
 .toJSONString(new JsonResult(-1, "订单号不能为空", new ResponseData()), SerializerFeatureUtil.FEATURES)));
 }

 Map<String, String> restmap = null;
 try {
 Map<String, String> parm = new HashMap<String, String>();
 parm.put("appid", APP_ID);
 parm.put("mch_id", MCH_ID);
 parm.put("transaction_id", tradeid);
 parm.put("out_trade_no", tradeno);
 parm.put("nonce_str", PayUtil.getNonceStr());
 parm.put("sign", PayUtil.getSign(parm, API_SECRET));

 String restxml = HttpUtils.post(ORDER_PAY_QUERY, XmlUtil.xmlFormat(parm, false));
 restmap = XmlUtil.xmlParse(restxml);
 } catch (Exception e) {
 LOG.error(e.getMessage(), e);
 }

 if (CollectionUtil.isNotEmpty(restmap) && "SUCCESS".equals(restmap.get("result_code"))) {
 // 订单查询成功 处理业务逻辑
 LOG.info("订单查询:订单" + restmap.get("out_trade_no") + "支付成功");
 WebUtil.response(response, WebUtil.packJsonp(callback, JSON
 .toJSONString(new JsonResult(1, "订单支付成功", new ResponseData()), SerializerFeatureUtil.FEATURES)));
 } else {
 if (CollectionUtil.isNotEmpty(restmap)) {
 LOG.info("订单支付失败:" + restmap.get("err_code") + ":" + restmap.get("err_code_des"));
 }
 WebUtil.response(response, WebUtil.packJsonp(callback, JSON
 .toJSONString(new JsonResult(-1, "订单支付失败", new ResponseData()), SerializerFeatureUtil.FEATURES)));
 }
 }

 /**
 * 订单支付微信服务器异步通知
 *
 * @param request
 * @param response
 */
 @RequestMapping("/pay/notify")
 public void orderPayNotify(HttpServletRequest request, HttpServletResponse response) {
 LOG.info("[/order/pay/notify]");
 response.setCharacterEncoding("UTF-8");
 response.setContentType("text/xml");
 try {
 ServletInputStream in = request.getInputStream();
 String resxml = FileUtil.readInputStream2String(in);
 Map<String, String> restmap = XmlUtil.xmlParse(resxml);
 LOG.info("支付结果通知:" + restmap);
 if ("SUCCESS".equals(restmap.get("result_code"))) {
 // 订单支付成功 业务处理
 String out_trade_no = restmap.get("out_trade_no"); // 商户订单号
 // 通过商户订单判断是否该订单已经处理 如果处理跳过 如果未处理先校验sign签名 再进行订单业务相关的处理

 String sing = restmap.get("sign"); // 返回的签名
 restmap.remove("sign");
 String signnow = PayUtil.getSign(restmap, API_SECRET);
 if (signnow.equals(sing)) {
 // 进行业务处理
 LOG.info("订单支付通知: 支付成功,订单号" + out_trade_no);

 // 处理成功后相应给响应xml
 Map<String, String> respMap = new HashMap<>();
 respMap = new HashMap<String, String>();
 respMap.put("return_code", "SUCCESS"); //相应给微信服务器
 respMap.put("return_msg", "OK");
 String resXml = XmlUtil.xmlFormat(restmap, true);
 response.getWriter().write(resXml);
 } else {
 LOG.info("订单支付通知:签名错误");
 }
 } else {
 LOG.info("订单支付通知:支付失败," + restmap.get("err_code") + ":" + restmap.get("err_code_des"));
 }
 } catch (Exception e) {
 LOG.error(e.getMessage(), e);
 }
 }

 /**
 * 订单退款 需要双向证书验证
 *
 * @param request
 * @param response
 * @param tradeno 微信订单号
 * @param orderno 商家订单号
 * @param callback
 */
 @RequestMapping(value = "/pay/refund", method = RequestMethod.POST)
 public void orderPayRefund(HttpServletRequest request, HttpServletResponse response, String tradeno, String orderno,
 String callback) {
 LOG.info("[/pay/refund]");
 if (StringUtil.isEmpty(tradeno) && StringUtil.isEmpty(orderno)) {
 WebUtil.response(response, WebUtil.packJsonp(callback, JSON
 .toJSONString(new JsonResult(-1, "订单号不能为空", new ResponseData()), SerializerFeatureUtil.FEATURES)));
 }

 Map<String, String> restmap = null;
 try {
 Map<String, String> parm = new HashMap<String, String>();
 parm.put("appid", APP_ID);
 parm.put("mch_id", MCH_ID);
 parm.put("nonce_str", PayUtil.getNonceStr());
 parm.put("transaction_id", tradeno);
 parm.put("out_trade_no", orderno);//订单号
 parm.put("out_refund_no", PayUtil.getRefundNo()); //退款单号
 parm.put("total_fee", "10"); // 订单总金额 从业务逻辑获取
 parm.put("refund_fee", "10"); // 退款金额
 parm.put("op_user_id", MCH_ID);
 parm.put("refund_account", "REFUND_SOURCE_RECHARGE_FUNDS");//退款方式
 parm.put("sign", PayUtil.getSign(parm, API_SECRET));

 //String restxml = HttpUtils.posts(ORDER_REFUND, XmlUtil.xmlFormat(parm, false));
 String restxml = HttpUtils.posts(ORDER_REFUND, XmlUtil.xmlFormat(parm, false));
 restmap = XmlUtil.xmlParse(restxml);
 } catch (Exception e) {
 LOG.error(e.getMessage(), e);
 }

 Map<String, String> refundMap = new HashMap<>();
 if (CollectionUtil.isNotEmpty(restmap) && "SUCCESS".equals(restmap.get("result_code"))) {
 refundMap.put("transaction_id", restmap.get("transaction_id"));
 refundMap.put("out_trade_no", restmap.get("out_trade_no"));
 refundMap.put("refund_id", restmap.get("refund_id"));
 refundMap.put("out_refund_no", restmap.get("out_refund_no"));
 LOG.info("订单退款:订单" + restmap.get("out_trade_no") + "退款成功,商户退款单号" + restmap.get("out_refund_no") + ",微信退款单号"
 + restmap.get("refund_id"));
 WebUtil.response(response,
 WebUtil.packJsonp(callback,
 JSON.toJSONString(new JsonResult(1, "订单获取成功", new ResponseData(null, refundMap)),
  SerializerFeatureUtil.FEATURES)));
 } else {
 if (CollectionUtil.isNotEmpty(restmap)) {
 LOG.info("订单退款失败:" + restmap.get("err_code") + ":" + restmap.get("err_code_des"));
 }
 WebUtil.response(response, WebUtil.packJsonp(callback, JSON
 .toJSONString(new JsonResult(-1, "订单退款失败", new ResponseData()), SerializerFeatureUtil.FEATURES)));
 }
 }

 /**
 * 订单退款查询
 * @param request
 * @param response
 * @param tradeid 微信订单号
 * @param tradeno 商户订单号
 * @param refundid 微信退款号
 * @param refundno 商家退款号
 * @param callback
 */
 @RequestMapping(value = "/pay/refund/query", method = RequestMethod.POST)
 public void orderPayRefundQuery(HttpServletRequest request, HttpServletResponse response, String refundid,
 String refundno, String tradeid, String tradeno, String callback) {
 LOG.info("[/pay/refund/query]");
 if (StringUtil.isEmpty(tradeid) && StringUtil.isEmpty(tradeno)
 && StringUtil.isEmpty(refundno) && StringUtil.isEmpty(refundid)) {
 WebUtil.response(response, WebUtil.packJsonp(callback, JSON
 .toJSONString(new JsonResult(-1, "退单号或订单号不能为空", new ResponseData()), SerializerFeatureUtil.FEATURES)));
 }

 Map<String, String> restmap = null;
 try {
 Map<String, String> parm = new HashMap<String, String>();
 parm.put("appid", APP_ID);
 parm.put("mch_id", MCH_ID);
 parm.put("transaction_id", tradeid);
 parm.put("out_trade_no", tradeno);
 parm.put("refund_id", refundid);
 parm.put("out_refund_no", refundno);
 parm.put("nonce_str", PayUtil.getNonceStr());
 parm.put("sign", PayUtil.getSign(parm, API_SECRET));

 String restxml = HttpUtils.post(ORDER_REFUND_QUERY, XmlUtil.xmlFormat(parm, false));
 restmap = XmlUtil.xmlParse(restxml);
 } catch (Exception e) {
 LOG.error(e.getMessage(), e);
 }

 Map<String, String> refundMap = new HashMap<>();
 if (CollectionUtil.isNotEmpty(restmap) && "SUCCESS".equals(restmap.get("result_code")) && "SUCCESS".equals(restmap.get("result_code"))) {
 // 订单退款查询成功 处理业务逻辑
 LOG.info("退款订单查询:订单" + restmap.get("out_trade_no") + "退款成功,退款状态"+ restmap.get("refund_status_0"));
 refundMap.put("transaction_id", restmap.get("transaction_id"));
 refundMap.put("out_trade_no", restmap.get("out_trade_no"));
 refundMap.put("refund_id", restmap.get("refund_id_0"));
 refundMap.put("refund_no", restmap.get("out_refund_no_0"));
 refundMap.put("refund_status", restmap.get("refund_status_0"));
 WebUtil.response(response, WebUtil.packJsonp(callback, JSON
 .toJSONString(new JsonResult(1, "订单退款成功", new ResponseData(null, refundMap)), SerializerFeatureUtil.FEATURES)));
 } else {
 if (CollectionUtil.isNotEmpty(restmap)) {
 LOG.info("订单退款失败:" + restmap.get("err_code") + ":" + restmap.get("err_code_des"));
 }
 WebUtil.response(response, WebUtil.packJsonp(callback, JSON
 .toJSONString(new JsonResult(-1, "订单退款失败", new ResponseData()), SerializerFeatureUtil.FEATURES)));
 }
 }

}

微信支付接口参数含义具体参考微信APP支付文档。

微信支付工具类

包含签名、订单号、退单号、随机串、服务器ip地址、客户端ip地址等方法。

package org.andy.wxpay.utils;

import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.util.Arrays;
import java.util.Date;
import java.util.Map;
import java.util.Set;

import javax.servlet.http.HttpServletRequest;

/**
 * 创建时间:2016年11月2日 下午7:12:44
 *
 * @author andy
 * @version 2.2
 */

public class PayUtil {

 /**
 * 生成订单号
 *
 * @return
 */
 public static String getTradeNo() {
 // 自增8位数 00000001
 return "TNO" + DatetimeUtil.formatDate(new Date(), DatetimeUtil.TIME_STAMP_PATTERN) + "00000001";
 }

 /**
 * 退款单号
 *
 * @return
 */
 public static String getRefundNo() {
 // 自增8位数 00000001
 return "RNO" + DatetimeUtil.formatDate(new Date(), DatetimeUtil.TIME_STAMP_PATTERN) + "00000001";
 }

 /**
 * 退款单号
 *
 * @return
 */
 public static String getTransferNo() {
 // 自增8位数 00000001
 return "TNO" + DatetimeUtil.formatDate(new Date(), DatetimeUtil.TIME_STAMP_PATTERN) + "00000001";
 }

 /**
 * 返回客户端ip
 *
 * @param request
 * @return
 */
 public static String getRemoteAddrIp(HttpServletRequest request) {
 String ip = request.getHeader("X-Forwarded-For");
 if (StringUtil.isNotEmpty(ip) && !"unKnown".equalsIgnoreCase(ip)) {
 // 多次反向代理后会有多个ip值,第一个ip才是真实ip
 int index = ip.indexOf(",");
 if (index != -1) {
 return ip.substring(0, index);
 } else {
 return ip;
 }
 }
 ip = request.getHeader("X-Real-IP");
 if (StringUtil.isNotEmpty(ip) && !"unKnown".equalsIgnoreCase(ip)) {
 return ip;
 }
 return request.getRemoteAddr();
 }

 /**
 * 获取服务器的ip地址
 *
 * @param request
 * @return
 */
 public static String getLocalIp(HttpServletRequest request) {
 return request.getLocalAddr();
 }

 public static String getSign(Map<String, String> params, String paternerKey) throws UnsupportedEncodingException {
 return MD5Utils.getMD5(createSign(params, false) + "&key=" + paternerKey).toUpperCase();
 }

 /**
 * 构造签名
 *
 * @param params
 * @param encode
 * @return
 * @throws UnsupportedEncodingException
 */
 public static String createSign(Map<String, String> params, boolean encode) throws UnsupportedEncodingException {
 Set<String> keysSet = params.keySet();
 Object[] keys = keysSet.toArray();
 Arrays.sort(keys);
 StringBuffer temp = new StringBuffer();
 boolean first = true;
 for (Object key : keys) {
 if (key == null || StringUtil.isEmpty(params.get(key))) // 参数为空不参与签名
 continue;
 if (first) {
 first = false;
 } else {
 temp.append("&");
 }
 temp.append(key).append("=");
 Object value = params.get(key);
 String valueStr = "";
 if (null != value) {
 valueStr = value.toString();
 }
 if (encode) {
 temp.append(URLEncoder.encode(valueStr, "UTF-8"));
 } else {
 temp.append(valueStr);
 }
 }
 return temp.toString();
 }

 /**
 * 创建支付随机字符串
 * @return
 */
 public static String getNonceStr(){
 return RandomUtil.randomString(RandomUtil.LETTER_NUMBER_CHAR, 32);
 }

 /**
 * 支付时间戳
 * @return
 */
 public static String payTimestamp() {
 return Long.toString(System.currentTimeMillis() / 1000);
 }
}

其他所需工具类参考项目源码

支付结果

APP支付测试完成

源代码地址:微信APP支付

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • 基于HTML5+js+Java实现单文件文件上传到服务器功能

    上传单文件到服务器       应公司要求,在HTML5页面上实现上传文件到服务器,对于一个还没毕业的实习生菜鸟来说,这可不得了-----不会,网上各种百度,找各种博客还是没解决,最后还是请教了公司的大神,人家给卸了一个例子,然后根据人家写的终于把这个上传文件搞定. 好了,开始上代码. HTML5代码: <form name="upform" action="" method="POST"> <input type ="

  • Java实现图片上传到服务器并把上传的图片读取出来

    在很多的网站都可以实现上传头像,可以选择自己喜欢的图片做头像,从本地上传,下次登录时可以直接显示出已经上传的头像,那么这个是如何实现的呢? 下面说一下我的实现过程(只是个人实现思路,实际网站怎么实现的不太清楚) 实现的思路: 工具:MySQL,eclipse 首先,在MySQL中创建了两个表,一个t_user表,用来存放用户名,密码等个人信息, 一个t_touxiang表,用来存放上传的图片在服务器中的存放路径,以及图片名字和用户ID, T_touxiang表中的用户ID对应了t_user中的i

  • JavaWeb项目部署到服务器详细步骤详解

    JavaWeb项目部署到服务器详细步骤 本地准备 在eclipse中将项目打成war文件:鼠标右键要部署到服务器上的项目 导出项目数据库文件 MySql导出数据库文件方法:利用Navicat for MySQL.鼠标右键要导出的数据库,选择转出SQL文件即可 Oracle导出数据库文件:利用PLSQL Developer即可 服务器准备 基本的jdk安装,服务器(比如tomcat)还有数据库的安装都必不可少 将项目的war文件复制到tomcat的wepapps文件夹下即可 创建和代码中数据库连接

  • Java解析调用webservice服务的返回XML串详解

    本文由Markdown语法编辑器编辑完成. 1. 需求分析: 已知当在调用某一webservice的服务时,如果调用成功,会接受到该服务的返回XML串.后端在获取了该XML原始串时,需要进行解析,将其解析为JSON格式,以便于发送到前台,供前台页面显示和交互. 2. 解决方案: 该XML的原始形式为: <?xml version="1.0" encoding="UTF-8" ?> <SOAP-ENV:Envelope xmlns:SOAP-ENV=

  • java 从服务器下载文件并保存到本地的示例

    昨天在做一个项目时,用到了从服务器上下载文件并保存到本地的知识,以前也没有接触过,昨天搞了一天,这个小功能实现了,下面就简单的说一下实现过程: 1.基础知识 当我们想要下载网站上的某个资源时,我们会获取一个url,它是服务器定位资源的一个描述,下载的过程有如下几步: (1)客户端发起一个url请求,获取连接对象. (2)服务器解析url,并且将指定的资源返回一个输入流给客户. (3)建立存储的目录以及保存的文件名. (4)输出了写数据. (5)关闭输入流和输出流. 2.实现代码的方法 /** *

  • 一次 Java 服务性能优化实例详解

    背景 前段时间我们的服务遇到了性能瓶颈,由于前期需求太急没有注意这方面的优化,到了要还技术债的时候就非常痛苦了. 在很低的 QPS 压力下服务器 load 就能达到 10-20,CPU 使用率 60% 以上,而且在每次流量峰值时接口都会大量报错,虽然使用了服务熔断框架 Hystrix,但熔断后服务却迟迟不能恢复.每次变更上线更是提心吊胆,担心会成为压死骆驼的最后一根稻草,导致服务雪崩. 在需求终于缓下来后,leader 给我们定下目标,限我们在两周内把服务性能问题彻底解决.近两周的排查和梳理中,

  • Java实现上传文件图片到指定服务器目录

    具体代码如下所示: ***web.xml*** <?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xm

  • java实现微信App支付服务端

    微信App支付服务端的实现方法,供大家参考,具体内容如下 引言 主要实现app支付统一下单.异步通知.调起支付接口.支付订单查询.申请退款.查询退款功能:封装了https对发起退款的证书校验.签名.xml解析等. 支付流程 具体支付流程参考"微信APP"文档,文档地址 APP支付:APP端点击下单--服务端生成订单,并调起"统一下单",返回app支付所需参数-–APP端"调起支付接口",发起支付--微信服务器端调用服务端回调地址-–服务端按照&q

  • java服务端微信APP支付接口详解

    一.微信APP支付接入商户服务中心 [申请流程指引] (https://open.weixin.qq.com/cgi-bin/showdocument?action=dir_list&t=resource/res_list&verify=1&id=open1419317780&token=84f23b4e9746c5963128711f225476cfd49ccf8c&lang=zh_CN) 二.开始开发 1.配置相关的配置信息 1.1.配置appid(Androi

  • PHP:微信小程序 微信支付服务端集成实例详解及源码下载

    微信小程序 微信支付服务端集 理论上集成微信支付的全部工作可以在小程序端完成,因为小程序js有访问网络的能力,但是为了安全,不暴露敏感key,而且可以使用官方提供的现成php demo更省力,于是在服务端完成签名与发起请求,小程序端只做一个wx.requestPayment(OBJECT)接口的对接. 整体集成过程与JSAPI.APP类似,先统一下单,然后拿返回的结果来请求支付. 一共三步: 1.小程序端通过wx.login的返回的code换取openid 2.服务端向微信统一下单 3.小程序端

  • 微信APP支付Java代码

    本文实例为大家分享了java微信APP支付代码,供大家参考,具体内容如下 import java.io.IOException; import java.io.UnsupportedEncodingException; import java.util.Random; import org.apache.http.ParseException; import org.apache.http.client.ClientProtocolException; import org.apache.htt

  • Android开发微信APP支付功能的要点小结

    基本概念 包名值得是你APP的包,在创建工程时候设置的,需要在微信支付平台上面设置. 签名指的是你生成APK时候所用的签名文件的md5,去掉:全部小写,需要在微信支付平台上面设置. 调试阶段,签名文件可以使用调试用的debug.keystore,签名可以直接在eclipse上面查看,或者用工具查看 ,安装打开输入包名即可查看. 发布的时候一定需要在微信支付平台上面设置成发布用的签名值. 官方的Demo里面的内容并不是全是必须的,甚至只需要有libammsdk.jar就够了,AndroidMani

  • java实现微信H5支付方法详解

    前面做了app微信支付的回调处理,现在需要做微信公众号的支付,花了一天多时间,终于折腾出来了!鉴于坑爹的微信官方没有提供Java版的demo,所以全靠自己按照同样坑爹的文档敲敲敲,所以记录下来,以供自己及后来人参考,不足之处,还请指正. 首先,我们贴出调用支付接口的H5页面,当然,在这个页面之前,还需要做很多其他的操作,我们一步一步的来. 坑爹的官方文档给了两个不同的支付接口,在微信公众平台开发中文档的"微信JS-SDK说明文档"中,给出的支付方式是下面被屏蔽的那一部分,而在商户平台的

  • springboot接入微信app支付的方法

    1.前戏 1.1请先完成微信APP支付接入商户服务中心 1.2详情请参考微信官方文档:https://open.weixin.qq.com/ 2.application.yml文件的配置如下 #微信支付配置 tenpayconfig: #商户APPID appId: asdfg12345 #商户号 mchId: 12345678 #商户的key(API密匙) key: qwertyuiop #API支付请求地址 payUrl: https://api.mch.weixin.qq.com/pay/

  • C#微信小程序服务端获取用户解密信息实例代码

     C#微信小程序服务端获取用户解密信息实例代码 实现代码: using AIOWeb.Models; using Newtonsoft.Json; using Newtonsoft.Json.Linq; using System; using System.Collections.Generic; using System.Data; using System.Data.SqlClient; using System.Linq; using System.Web; namespace AIOWe

  • PHP实现的微信APP支付功能示例【基于TP5框架】

    本文实例讲述了PHP实现的微信APP支付功能.分享给大家供大家参考,具体如下: 1.进行支付请求 他给的DEMO 用的时候有时候会报错 1)我遇到的情况 把  WxPay.Api.php这个文件的 postXmlCurl 这个 方法里 // curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,TRUE); // curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,2);//严格校验 curl_setopt($ch,CURLOPT_SSL_VER

  • ASP.Net项目中实现微信APP支付功能

    最近挺忙的,没时间写东西.然后在弄微信APP支付,网上的搜索一趟,都比较凌乱,我也遇到一些坑,不过也算弄好了,记录分享一下. 1.准备各种调用接口需要的参数,配置app.config. <!--AppID--> <add key="AppID" value="" /> <!--AppSecret--> <add key="AppSecret" value="" /> <!-

随机推荐