目前,公司正在把业务从公众号向小程序迁移,本人负责订单功能的开发,现在把微信小程序接入微信支付这块的知识分享给大家,可能有部分人对微信支付不太了解,可以参考下面的微信支付流程图。
微信支付流程图
我是用weixin-java-tools这个开源框架做的,目前这个开源社区还很活跃,有兴趣的朋友可以研究一下。weixin-java-tools微信支付功能集成如下:
- 登录小程序平台设置常用的配置,request合法域名,uploadFile合法域名,downloadFile合法域名。
2.小程序开通微信支付功能,微信支付用到微信支付商户号,支付证书。
3.引入maven坐标
<dependency>
<groupId>com.github.binarywang</groupId>
<artifactId>weixin-java-pay</artifactId>
<version>3.2.0</version>
</dependency>
4.调用微信统一下单接口,我这里贴出关键代码。
@RequestMapping(value="/unifiedOrder/{appId}")
public JSONObject unifiedOrder (@RequestBody JSONObject inData,@PathVariable String appId){
String openId = inData.getString("openId");//微信用户openId
String tradeNo = inData.getString("tradeNo");//订单编号
Integer totalFee = inData.getInteger("orderPrice");
//商品价格,单位为分
String body = inData.getString("body"); //商品名称
String ip = inData.getString("ip");//客户端ip
String notifyUrl = environment.getProperty("spring."+appId+".notifyUrl");//微信回调业务接口地址
WxPayUnifiedOrderRequest prepayInfo = new WxPayUnifiedOrderRequest();
long now = System.currentTimeMillis();
String nowStr = String.valueOf(now);
int length = nowStr.length();
String current = nowStr.substring(length-5,length);
prepayInfo.setOpenid(openId);
prepayInfo.setTradeType("JSAPI");
prepayInfo.setTotalFee(totalFee);
prepayInfo.setBody(body);
prepayInfo.setSpbillCreateIp(ip);
prepayInfo.setOutTradeNo(tradeNo+"|"+current);
prepayInfo.setNotifyUrl(notifyUrl);
JSONObject jsObj = new JSONObject();
try {
final WxPayService payService = WeixinServiceFactory.getWxPayService(appId,environment);
Object payInfo = payService.createOrder(prepayInfo);
jsObj.put("code", ResponseCodeEnum.RESPONSE_CODE_SUCCESS.getCode());
jsObj.put("message",ResponseCodeEnum.RESPONSE_CODE_SUCCESS.getMessage());
jsObj.put("data", payInfo);
} catch (WxPayException e) {
logger.error("创建订单支付信息,出现异常",e);
jsObj.put("code", ResponseCodeEnum.RESPONSE_CODE_INTERNAL_ERROR.getCode());
jsObj.put("message",ResponseCodeEnum.RESPONSE_CODE_INTERNAL_ERROR.getMessage());
}
return jsObj
接口返回数据格式如下:
{
"code": 200,
"data": {
"appId": "12123123123123",//微信小程序appid
"timeStamp": "1559713220",//当前时间戳
"nonceStr": "1559713220240",//随机字符串
"packageValue": "prepay_id=wx01231231231231230",//prepay_id为预支付交易会话标识
"signType": "MD5",//支付签名方式
"paySign": "213213123123"//支付签名
},
"message": "SUCCESS"
}
4.小程序页面发起微信支付请求,参数为第三步返回的参数
wx.requestPayment({
"appId": 'wx00000000000000',//小程序appId
"timeStamp": "",//当前时间戳
"nonceStr": "",//随机字符串
"package": "",//预支付交易会话标识 取接口返回端的packageValue字段
"signType": "",
"paySign":"",
//小程序微信支付成功的回调通知
'success': function (res) {
},
//小程序支付失败的回调通知
'fail': function (res) {
}
})
}
5.微信支付平台异步回调业务接口,修改订单支付状态