目前,公司正在把业务从公众号向小程序迁移,本人负责订单功能的开发,现在把微信小程序接入微信支付这块的知识分享给大家,可能有部分人对微信支付不太了解,可以参考下面的微信支付流程图。
微信支付流程图
我是用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.微信支付平台异步回调业务接口,修改订单支付状态