← 返回场景 1 · 小程序内点餐支付

前置条件(缺一不可)

  • 1
    小程序 appid 已与商户号绑定 文档要求「提前提供 appid,主体一致」。实测未绑定的 appid 会返回:sub_mch_id与sub_appid不匹配
  • 2
    拿到该小程序下的 openid wx.login 拿 code → 后端 code2Session 换 openid。缺 openid 会返回:用户openid不能为空
  • 3
    商户已完成授权 商户在「邮付小助手」小程序里点同意,状态变「已绑定」
实测进度:平台侧参数校验已全部验证通过 —— 用该商户已绑定的 appid 调用,错误已推进到 无效的openid,说明 appid 绑定这关是通的,只差一个真实 openid 就能完成支付。

下单测试

实现代码

// pages/pay/pay.js  —— 点餐页「去支付」
Page({
  data: { total: 0, paying: false },

  onPay() {
    if (this.data.paying) return;
    this.setData({ paying: true });

    // ① 每次支付都重新拿 code(有效期 5 分钟,一次性)
    wx.login({
      success: async ({ code }) => {
        try {
          // ② 后端换 openid + 调 miniAppPay.do,返回 6 个支付参数
          const res = await wx.request({
            url: 'https://your-api.com/api/wxyf/miniapp/prepay',
            method: 'POST',
            data: { code, tableNo: this.data.tableNo }
          });
          const r = res.data || {};
          if (!r.ok) {
            wx.showToast({ title: r.msg || '下单失败', icon: 'none' });
            return;
          }

          // ③ 拉起微信支付
          wx.requestPayment({
            timeStamp: r.pay.timeStamp,
            nonceStr:  r.pay.nonceStr,
            package:   r.pay.package,
            signType:  r.pay.signType,   // 文档示例是 RSA,务必按平台返回传
            paySign:   r.pay.paySign,
            success: () => {
              // ④ 前端只做引导,最终以服务端回调/查单为准
              wx.redirectTo({ url: '/pages/result/result?orderId=' + r.orderId });
            },
            fail: (e) => {
              if (e.errMsg.indexOf('cancel') === -1) {
                wx.showToast({ title: '支付未完成', icon: 'none' });
              }
            }
          });
        } finally {
          this.setData({ paying: false });
        }
      }
    });
  }
});