H5在微信公眾號里調用微信支付總結(前端)

1.JSSDK(chooseWXPay)方法調用

該方式出現的版本比較晚,需要jssdk注入,不需要參數appId(個人理解為了跟其他js API接口統一)
JSSDK使用步驟 請看官網:https://developers.weixin.qq.com/doc/offiaccount/OA_Web_Apps/JS-SDK.html
接入前準備【支付授權目錄說明】:https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=7_3
因調用支付的頁面較多,支付授權目錄 配置時,個人推薦配置 頂級目錄,可根據自己需求而定。
confirmPayOrder(orderInfo, pageType) {
        if (isWx()) {
          Toast.loading({
            message: "加載中...",
            forbidClick: true,
          });
          // 將訂單id傳遞給后臺
          orderPayOrder({ id: orderInfo.id })
            .then((resOrder) => {
              getWxConfig().then(() => {
                wx.ready(() => {
                  // chooseWXPay參數說明文檔 https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=7_7&index=6
                  wx.chooseWXPay({
                    appId: resOrder.result.appId, //公眾號appId,chooseWXPay調用此處可省略,提醒后端注意大小寫
                    timestamp: resOrder.result.timestamp, // 支付簽名時間戳,注意微信jssdk中的所有使用timestamp字段均為小,部分系統取到的值為毫秒級,需要轉換成秒(10位數字)
                    nonceStr: resOrder.result.nonceStr, // 支付簽名隨機串,不長于 32 位
                    package: resOrder.result.payPackage, // 統一支付接口返回的prepay_id參數值,提交格式如:prepay_id=\*\*\*)
                    signType: resOrder.result.signType, // 簽名方式:MD5,提醒后端用到加密的地方都用MD5
                    paySign: resOrder.result.paySign, // 支付簽名:后端注意生成規則 https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=4_3
                    success: (res) => {
                      // 支付成功回調:微信團隊鄭重提示:不保證絕對可靠,切記!
                      // 據說部分ios手機,成功的回調不執行,所以為了保證回調執行,在complete里也做了回調執行
                      if (res.errMsg === "chooseWXPay:ok") {
                        Toast.success("支付成功");
                        this.refreshData(orderInfo.id, pageType);
                      }
                    },
                    complete: (res) => {
                      // 調用完成時的回調:成功或失敗都會執行
                      if (res.errMsg === "chooseWXPay:ok") {
                        Toast.success("支付成功");
                        this.refreshData(orderInfo.id, pageType);
                        console.log("complete支付成功:", res);
                      } /*else if (res.errMsg === "chooseWXPay:cancel") {
                        Toast.fail("取消支付");
                        this.refreshData(orderInfo.id, pageType);
                        console.log("complete取消支付:",res);
                      } else if (res.errMsg === "chooseWXPay:fail") {
                        Toast.fail("支付失敗");
                        this.refreshData(orderInfo.id, pageType);
                        console.log("complete支付失敗:",res);
                      }*/
                    },
                    fail: (res) => {
                      Toast.fail("支付失敗");
                      console.log("支付失敗:", res);
                      this.refreshData(orderInfo.id, pageType);
                    },
                    cancel: (res) => {
                      Toast.fail("取消支付");
                      console.log("取消支付:", res);
                      this.refreshData(orderInfo.id, pageType);
                    },
                  });
                });
              });
            })
            .catch((err) => {
              // 后臺報錯 彈框提示
              this.showTipDialog = true;
              this.errTip = err.errorDesc;
            });
        } else {
          Dialog.alert({
            message: "請在微信環境下打開,否則無法付款",
            className: "dialog-alert",
          }).then(() => {
            // close
          });
        }
    },

// 獲取微信配置信息
export function getWxConfig() {
  return new Promise((resolve, reject) => {
    const url = encodeURIComponent(location.href.split("#")[0]); //獲取當前頁面路由
    // 調用接口獲取微信簽名,入參url一般是當前頁面的url(不包括#及后面部分)
    getWxSignature({ url })
      .then((res) => {
        if (Object.keys(res.result)) {
          const { appId, nonceStr, signature, timestamp } = res.result;
          wx.config({
            debug: false, // 開啟調試模式
            appId: appId, // appId 必填,公眾號的唯一標識
            timestamp: "" + timestamp, // 必填,生成簽名的時間戳
            nonceStr: nonceStr, // 必填,生成簽名的隨機串
            signature: signature, // 必填,簽名
            jsApiList: ["getLocation", "chooseWXPay", "scanQRCode"], // 必填,需要使用的JS接口列表
          });
        }
        resolve(res);
      })
      .catch((e) => {
        reject(e);
        console.log("微信配置信息調用失敗:" + e);
      });
  });
}

2.JSAPI調用支付(僅針對微信支付這個功能)

JSAPI出現的版本更早,無需引用jssdk,無需wx.config方法注入,需要參數appId
confirmPayOrder(orderInfo, pageType) {
  if (isWx()) {   
      Toast.loading({
            message: "加載中...",
            forbidClick: true,
          });
          orderPayOrder({ id: orderInfo.id }).then((resOrder) => {
            let _this = this;
            var onBridgeReady = () => {
              // eslint-disable-next-line
              WeixinJSBridge.invoke(
                "getBrandWCPayRequest",
                {
                  appId: resOrder.result.appId, //公眾號ID,此處必傳
                  timeStamp: resOrder.result.timestamp, //時間戳,timeStamp S需要大寫
                  nonceStr: resOrder.result.nonceStr, //隨機串
                  package: resOrder.result.payPackage,
                  signType: resOrder.result.signType, //微信簽名方式MD5
                  paySign: resOrder.result.paySign, //微信簽名
                },
                function (res) {
                  if (res.err_msg == "get_brand_wcpay_request:ok") {
                    // 使用以上方式判斷前端返回,微信團隊鄭重提示:res.err_msg將在用戶支付成功后返回ok,但并不保證它絕對可靠。
                    _this.refreshData(orderInfo.id, pageType);
                  }
                  if (res.err_msg == "get_brand_wcpay_request:fail") {
                    Toast.fail("支付失敗");
                    _this.refreshData(orderInfo.id, pageType);
                  }
                  if (res.err_msg == "get_brand_wcpay_request:cancel") {
                    Toast.fail("支付取消");
                    _this.refreshData(orderInfo.id, pageType);
                  }
                }
              );
            };
            //調用微信支付接口
            if (typeof WeixinJSBridge == "undefined") {
              if (document.addEventListener) {
                document.addEventListener(
                  "WeixinJSBridgeReady",
                  onBridgeReady,
                  false
                );
              } else if (document.attachEvent) {
                document.attachEvent("WeixinJSBridgeReady", onBridgeReady);
                document.attachEvent("onWeixinJSBridgeReady", onBridgeReady);
              }
            } else {
              onBridgeReady();
            }
          });
        } else {
          Dialog.alert({
            message: "請在微信環境下打開,否則無法付款",
            className: "dialog-alert",
          }).then(() => {
            // close
          });
        }
  }

3.在調試過程報錯解決

調用支付JSAPI,很多錯誤都會報缺少參數:total_fee

1、請檢查預支付會話標識prepay_id是否已失效,如果已經操作的訂單,可能在微信有記錄,最好換一條數據測試。
2、請求的appid與下單接口的appid是否一致,appid 是H5所在公眾號的appId,此處需要注意,后端調用微信返回的是appid,前臺需要配置的參數是appId,注意大小寫。
3、以下幾點都注意核對以下,金額是“分”等等.


image.png
支付簽名失敗

image.png

讓后端確認簽名生成規則,參考官網:https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=4_3
簽名校驗驗證:https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=20_1

當前頁面URL未注冊

原因就是:授權目錄配置的不對,請仔細核對,配置好后,一般5分鐘內生效。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,908評論 6 541
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,324評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,018評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,675評論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,417評論 6 412
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,783評論 1 329
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,779評論 3 446
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,960評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,522評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,267評論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,471評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,009評論 5 363
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,698評論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,099評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,386評論 1 294
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,204評論 3 398
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,436評論 2 378

推薦閱讀更多精彩內容