H5在微信公眾號里調(diào)用微信支付總結(jié)(前端)

1.JSSDK(chooseWXPay)方法調(diào)用

該方式出現(xiàn)的版本比較晚舔痪,需要jssdk注入津滞,不需要參數(shù)appId(個人理解為了跟其他js API接口統(tǒng)一)
JSSDK使用步驟 請看官網(wǎng):https://developers.weixin.qq.com/doc/offiaccount/OA_Web_Apps/JS-SDK.html
接入前準(zhǔn)備【支付授權(quán)目錄說明】:https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=7_3
因調(diào)用支付的頁面較多铝侵,支付授權(quán)目錄 配置時,個人推薦配置 頂級目錄触徐,可根據(jù)自己需求而定咪鲜。
confirmPayOrder(orderInfo, pageType) {
        if (isWx()) {
          Toast.loading({
            message: "加載中...",
            forbidClick: true,
          });
          // 將訂單id傳遞給后臺
          orderPayOrder({ id: orderInfo.id })
            .then((resOrder) => {
              getWxConfig().then(() => {
                wx.ready(() => {
                  // chooseWXPay參數(shù)說明文檔 https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=7_7&index=6
                  wx.chooseWXPay({
                    appId: resOrder.result.appId, //公眾號appId,chooseWXPay調(diào)用此處可省略锌介,提醒后端注意大小寫
                    timestamp: resOrder.result.timestamp, // 支付簽名時間戳嗜诀,注意微信jssdk中的所有使用timestamp字段均為小,部分系統(tǒng)取到的值為毫秒級孔祸,需要轉(zhuǎn)換成秒(10位數(shù)字)
                    nonceStr: resOrder.result.nonceStr, // 支付簽名隨機串隆敢,不長于 32 位
                    package: resOrder.result.payPackage, // 統(tǒng)一支付接口返回的prepay_id參數(shù)值,提交格式如:prepay_id=\*\*\*)
                    signType: resOrder.result.signType, // 簽名方式:MD5,提醒后端用到加密的地方都用MD5
                    paySign: resOrder.result.paySign, // 支付簽名:后端注意生成規(guī)則 https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=4_3
                    success: (res) => {
                      // 支付成功回調(diào):微信團隊鄭重提示:不保證絕對可靠崔慧,切記拂蝎!
                      // 據(jù)說部分ios手機,成功的回調(diào)不執(zhí)行惶室,所以為了保證回調(diào)執(zhí)行温自,在complete里也做了回調(diào)執(zhí)行
                      if (res.errMsg === "chooseWXPay:ok") {
                        Toast.success("支付成功");
                        this.refreshData(orderInfo.id, pageType);
                      }
                    },
                    complete: (res) => {
                      // 調(diào)用完成時的回調(diào):成功或失敗都會執(zhí)行
                      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: "請在微信環(huán)境下打開,否則無法付款",
            className: "dialog-alert",
          }).then(() => {
            // close
          });
        }
    },

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

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

JSAPI出現(xiàn)的版本更早鸠踪,無需引用jssdk,無需wx.config方法注入复斥,需要參數(shù)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);
                  }
                }
              );
            };
            //調(diào)用微信支付接口
            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: "請在微信環(huán)境下打開,否則無法付款",
            className: "dialog-alert",
          }).then(() => {
            // close
          });
        }
  }

3.在調(diào)試過程報錯解決

調(diào)用支付JSAPI侣集,很多錯誤都會報缺少參數(shù):total_fee

1键俱、請檢查預(yù)支付會話標(biāo)識prepay_id是否已失效,如果已經(jīng)操作的訂單世分,可能在微信有記錄编振,最好換一條數(shù)據(jù)測試。
2臭埋、請求的appid與下單接口的appid是否一致踪央,appid 是H5所在公眾號的appId,此處需要注意瓢阴,后端調(diào)用微信返回的是appid畅蹂,前臺需要配置的參數(shù)是appId,注意大小寫荣恐。
3液斜、以下幾點都注意核對以下累贤,金額是“分”等等.


image.png
支付簽名失敗

image.png

讓后端確認(rèn)簽名生成規(guī)則,參考官網(wǎng):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

當(dāng)前頁面URL未注冊

原因就是:授權(quán)目錄配置的不對少漆,請仔細核對臼膏,配置好后,一般5分鐘內(nèi)生效示损。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末渗磅,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子检访,更是在濱河造成了極大的恐慌始鱼,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,525評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件脆贵,死亡現(xiàn)場離奇詭異医清,居然都是意外死亡,警方通過查閱死者的電腦和手機卖氨,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,203評論 3 395
  • 文/潘曉璐 我一進店門状勤,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人双泪,你說我怎么就攤上這事持搜。” “怎么了焙矛?”我有些...
    開封第一講書人閱讀 164,862評論 0 354
  • 文/不壞的土叔 我叫張陵葫盼,是天一觀的道長。 經(jīng)常有香客問我村斟,道長贫导,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,728評論 1 294
  • 正文 為了忘掉前任蟆盹,我火速辦了婚禮孩灯,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘逾滥。我一直安慰自己峰档,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,743評論 6 392
  • 文/花漫 我一把揭開白布寨昙。 她就那樣靜靜地躺著讥巡,像睡著了一般。 火紅的嫁衣襯著肌膚如雪舔哪。 梳的紋絲不亂的頭發(fā)上欢顷,一...
    開封第一講書人閱讀 51,590評論 1 305
  • 那天,我揣著相機與錄音捉蚤,去河邊找鬼抬驴。 笑死炼七,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的布持。 我是一名探鬼主播特石,決...
    沈念sama閱讀 40,330評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼鳖链!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起墩莫,我...
    開封第一講書人閱讀 39,244評論 0 276
  • 序言:老撾萬榮一對情侶失蹤芙委,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后狂秦,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體灌侣,經(jīng)...
    沈念sama閱讀 45,693評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,885評論 3 336
  • 正文 我和宋清朗相戀三年裂问,在試婚紗的時候發(fā)現(xiàn)自己被綠了侧啼。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,001評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡堪簿,死狀恐怖痊乾,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情椭更,我是刑警寧澤哪审,帶...
    沈念sama閱讀 35,723評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站虑瀑,受9級特大地震影響湿滓,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜舌狗,卻給世界環(huán)境...
    茶點故事閱讀 41,343評論 3 330
  • 文/蒙蒙 一叽奥、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧痛侍,春花似錦朝氓、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,919評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至岂膳,卻和暖如春誓竿,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背谈截。 一陣腳步聲響...
    開封第一講書人閱讀 33,042評論 1 270
  • 我被黑心中介騙來泰國打工筷屡, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留涧偷,地道東北人。 一個月前我還...
    沈念sama閱讀 48,191評論 3 370
  • 正文 我出身青樓毙死,卻偏偏與公主長得像燎潮,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子扼倘,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,955評論 2 355

推薦閱讀更多精彩內(nèi)容