小程序调用支付功能

完整的小程序支付代码请查看WeiPHP根目录下的weiapp_demo目录

小程序提供了微信支付接口,但需要后端服务器先调用统一下单接口先下单,得到prepay_id才能支付。

因此首先我们需要先让后端服务统一下单,下单需要的参数如下

参数名类型必填说明
moneyFloat(10,2)单位:元,订单的金额
bodyString(128)商品描述,格式:商家名称-销售商品类目
out_trade_noString(32)商户订单号,商户系统内部的订单号,32个字符内、可包含字母
openidString(128)用户标识

调用例子:

  1. order: function () {
  2. var url = app.url + 'weiapp/Api/payment&PHPSESSID=' + wx.getStorageSync('PHPSESSID')
  3. var that = this
  4. wx.request({ //让服务器端统一下单,并返回小程序支付的参数
  5. url: url,
  6. data: {
  7. money: 1, //支付1元
  8. openid: wx.getStorageSync('openid')
  9. },
  10. success: function (res) {
  11. if (res.data.status == 0) {//服务器参数返回不正常,显示错误信息
  12. wx.showToast({
  13. title: res.data.msg,
  14. icon: '../../images/icon_wrong.png',
  15. duration: 2000,
  16. })
  17. } else { //服务器参数返回正常,调用小程序支付接口
  18. that.payment(res.data)
  19. }
  20. }
  21. })
  22. },

后端服务器PHP的payment方法,在这方法里我们指定Home/Service/payok 为异步接收微信的支付结果

  1. function payment()
  2. {
  3. $info = get_pbid_appinfo();
  4. $money = I('money');
  5. $body = I('body');
  6. if (empty($body)) {
  7. // 商家名称-销售商品类目
  8. $body = $info ['public_name'] . '-服务购买';
  9. }
  10. $out_trade_no = I('out_trade_no');
  11. if (empty($out_trade_no)) {
  12. $out_trade_no = date('ymd') . NOW_TIME . rand(100, 999);
  13. }
  14. $openid = I('openid');
  15. if (empty($openid)) {
  16. $token = get_pbid();
  17. $openid = $GLOBALS ['myinfo'] [$token] ['openid'];
  18. }
  19. $appid = $info ['appid'];
  20. $param ['body'] = $body;
  21. $param ['out_trade_no'] = $out_trade_no;
  22. $param ['total_fee'] = $money * 100;
  23. $param ['openid'] = $openid;
  24. $param ['mch_id'] = $info ['mch_id'];
  25. $param ['partner_key'] = $info ['partner_key'];
  26. $param ['attach'] = I('username');
  27. $order = D('weixin/Payment')->weiapp_pay($appid, $param, 'Home/Service/payok');
  28. echo json_url($order);
  29. }

下完单后返回小程序支付需要的全部参数,直接使用即可

  1. payment: function (data) {
  2. wx.requestPayment({
  3. 'timeStamp': data.timeStamp,
  4. 'nonceStr': data.nonceStr,
  5. 'package': data.package,
  6. 'signType': data.signType,
  7. 'paySign': data.paySign,
  8. success: function (res) { //支付成功,提示用户
  9. wx.showToast({
  10. title: '支付成功',
  11. icon: 'success',
  12. duration: 2000,
  13. })
  14. },
  15. fail: function (res) { //支付失败,提示失败原因
  16. wx.showToast({
  17. title: res.errMsg,
  18. icon: '../../images/icon_wrong.png',
  19. duration: 2000,
  20. })
  21. }
  22. })
  23. }

要查询微信支付结果,可参考下一章:异步接收支付结果 章节