用户
 找回密码
 立即注册

QQ登录

只需一步,快速开始

微客吧 首页 教程 微信小程序 实战教程 查看内容

玩转小程序支付之付款(统一下单)

纸飞机 2017-6-15 11:16

小程序的业务流程如下商户系统和微信支付系统主要交互说明:步骤1:用户在商户APP中选择商品,提交订单,选择微信支付。 步骤2:商户后台收到用户支付单,调用微信支付统一下单接口。参见【统一下单API】。 步骤3 ...

小程序

的业务流程如下

商户系统和微信支付系统主要交互说明:

步骤1:用户在商户APP中选择商品,提交订单,选择微信支付。

步骤2:商户后台收到用户支付单,调用微信支付统一下单接口。参见【统一下单API】。

步骤3:统一下单接口返回正常的prepay_id,再按签名规范重新生成签名后,将数据传输给APP。参与签名的字段名为appid,partnerid,prepayid,noncestr,timestamp,package。注意:package的值格式为Sign=WXPay

步骤4:商户APP调起微信支付。api参见本章节【app端开发步骤说明】

步骤5:商户后台接收支付通知。api参见【支付结果通知API】

步骤6:商户后台查询支付结果。,api参见【查询订单API】

API链接:

https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=8_3

支付的流程为:先调用统一下单API---->接着在小程序wx.requestPayment发起支付---->支付完之后会调用支付结果通知

小程序端代码

  1. /**
  2. * 支付
  3. */
  4. var pay = function (event, that) {
  5. if (that.data.detail.fee.indexOf("免费")>-1){
  6. goApply(event, that)
  7. }else{
  8. wx.request({
  9. url: app.globalData.server + 'requestPay/',
  10. method: "POST",
  11. data: {
  12. activityId: event.currentTarget.dataset.activityid,
  13. userId: app.globalData.userInfo.id,
  14. sessionThirdKey: wx.getStorageSync('sessionThirdKey'),
  15. money: that.data.detail.fee,
  16. describe: that.data.detail.name,
  17. detail: '报名活动费用'
  18. },
  19. header: {
  20. "Content-Type": "application/x-www-form-urlencoded"
  21. },
  22. success: function (res) {
  23. console.info(res);
  24. //发起微信支付
  25. wx.requestPayment({
  26. 'timeStamp': res.data.timeStamp,
  27. 'nonceStr': res.data.nonceStr,
  28. 'package': res.data.package_,
  29. 'signType': 'MD5',
  30. 'paySign': res.data.paySign,
  31. success: function (res) {
  32. console.info(res)
  33. //报名
  34. goApply(event, that)
  35. },
  36. fail: function (res) {
  37. console.info(res)
  38. },
  39. complete: function (res) {
  40. console.info(res)
  41. }
  42. })
  43. }
  44. })
  45. }
  46. }

后台Java代码:(基于SpringBoot)

  1. @RestController
  2. public class PayApi {
  3. @Value("${wxapp.appid}")
  4. private String appId;
  5. @Value("${wxapp.secret}")
  6. private String secret;
  7. @Value("${wxapp.url.jscode2session}")
  8. private String jscode2session;
  9. @Value("${wx.mch.id}")
  10. private String mchId;
  11. @Value("${wx.unified.order.url}")
  12. private String createOrderURL;
  13. @Value("${wx.pay.api.key}")
  14. private String key;
  15. @Value("${wx.bill.create.ip}")
  16. private String spBillCreateIp;
  17. @Value("${wx.server.url}")
  18. private String baseUrl;
  19. @Autowired
  20. private RedisClient redisClient;
  21. @Resource(name = "wxappUserServiceImpl")
  22. private IWxappUserService wxappUserService;
  23. @Resource(name = "wxappActivityServiceImpl")
  24. private IWxappActivityService wxappActivityService;
  25. @Resource(name = "wxappActivityApplyServiceImpl")
  26. private IWxappActivityApplyService wxappActivityApplyService;
  27. @Resource(name = "wxappPayServiceImpl")
  28. private IWxappPayService wxappPayService;
  29. @RequestMapping(value = "/requestPay",method = RequestMethod.POST)
  30. public WxappPayDto requestPay(String userId, String activityId, String sessionThirdKey, String money, String describe, String detail) throws Exception {
  31. WxappPayDto dto = new WxappPayDto();
  32. //获取保存的sessionThirdKey(里面保存了openId)
  33. String sessionKey = redisClient.get(sessionThirdKey);
  34. String openId = sessionKey.split("w#w#w")[0];
  35. //订单号
  36. String orderNo="wx"+userId+"_"+System.currentTimeMillis();
  37. dto = prePay(userId,activityId,openId,orderNo,money,describe,detail);
  38. return dto;
  39. }
  40. /**
  41. * 统一下单
  42. * @param userId
  43. * @param activityId
  44. * @param openId
  45. * @param orderNo
  46. * @param money
  47. * @param describe
  48. * @param detail
  49. * @return
  50. */
  51. private WxappPayDto prePay(String userId,String activityId,String openId,String orderNo,String money,String describe,String detail){
  52. money = String.valueOf(