最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

uniapp前端實(shí)現(xiàn)微信支付功能全過程(小程序、公眾號H5、app)

 更新時間:2024年09月18日 10:31:59   作者:UU-阿Q  
這篇文章主要介紹了uniapp前端實(shí)現(xiàn)微信支付功能的相關(guān)資料,通過uniapp開發(fā)跨平臺應(yīng)用時,需要處理不同平臺的支付方式,包括微信小程序支付、公眾號H5支付和App支付,需要的朋友可以參考下

前言

這段時間通過uniapp開發(fā)一個三端合一的項(xiàng)目,涉及到不同平臺的支付方式,這里為大家簡單介紹一下,希望能有所幫助;
閱讀: 微信支付文檔

一、微信小程序支付

  • 通過wx.login()獲取code、調(diào)用后端接口獲取openid;
wx.login({
  success (res) {
    if (res.code) {
      //發(fā)起網(wǎng)絡(luò)請求獲取openid,一般是訪問后端封裝好的接口,也可以通過訪問微信官方接口獲取
      uni.request({
         url: '后端接口地址,獲取openid',
         method: 'GET',
         success(res) {
           //獲取openid:用戶真實(shí)唯一id進(jìn)行保存
           console.log(res.data.openid)
        }
      })
    } else {
      console.log('登錄失敗!' + res.errMsg)
    }
  }
})
  • 調(diào)用后端接口創(chuàng)建訂單,獲取orderId;
uni.request({
  url: '后端接口地址,獲取訂單id',
  method: 'POST',
  data: { 傳入接口需要的參數(shù),如商品金額,商品個數(shù)等 },
  success(res) {
    console.log(res.data.orderId)
  }
})
  • 調(diào)用后端接口獲取支付核心參數(shù),預(yù)支付;
uni.request({
  url: '后端接口地址,獲取支付核心數(shù)據(jù)',
  method: 'POST',
  data: { 傳入接口需要的參數(shù),如訂單ID,openId等 },
  success(res) {
    console.log(res.data)
    //接口會返回以下核心參數(shù)
    //timeStamp 時間戳
    //nonceStr  隨機(jī)字符串
    //package   統(tǒng)一下單接口返回的 prepay_id 參數(shù)值
    //signType  簽名算法
    //paySign   簽名
  }
})
  • 通過支付核心參數(shù)調(diào)用wx.requestPayment()發(fā)起支付;
  //調(diào)用微信官方支付接口彈出付款界面,輸入密碼扣款
  wx.requestPayment({
     timeStamp,  //時間戳
     nonceStr,   //隨機(jī)字符串
     package,    //prepay_id
     signType,   //簽名算法MD5
     paySign,    //簽名
     success (res) {
       if (res.errMsg == "requestPayment:ok"){
          console.log('支付成功', res)
       }else{
          console.log('支付失敗')
       }
     },
     fail (res) { 
       console.log('支付失敗', res)
     }
  })

二、公眾號H5支付

支付方式可以參考兩種方式:

  • JSAPI 支付:通過JSAPI下單接口獲取到發(fā)起支付的必要參數(shù)prepay_id,然后使用微信支付提供的前端JS方法調(diào)起公眾號支付
  • 在獲取訂單id、openid后,調(diào)用預(yù)支付,獲取JSAPI核心參數(shù);
uni.request({
  url: '后端接口地址,獲取支付核心數(shù)據(jù)',
  method: 'POST',
  data: { 傳入接口需要的參數(shù),如訂單ID,openId等 },
  success(res) {
    //調(diào)用下方支付方法
    wxpay(res.data)
    console.log(res.data)
    //接口會返回以下核心參數(shù)
    //appId     公眾號ID
    //timeStamp 時間戳
    //nonceStr  隨機(jī)字符串
    //package   統(tǒng)一下單接口返回的 prepay_id 參數(shù)值
    //signType  微信簽名方式RSA
    //paySign   微信簽名
    
  }
})
  • 通過JSAPI核心參數(shù)發(fā)起支付;
   // 檢測支付環(huán)境中的 WeixinJSBridge
    function wxpay(data) {
      if (typeof WeixinJSBridge == "undefined") {
        if (document.addEventListener) {
          document.addEventListener('WeixinJSBridgeReady', onBridgeReady(data), false);
        } else if (document.attachEvent) {
          document.attachEvent('WeixinJSBridgeReady', onBridgeReady(data));
          document.attachEvent('onWeixinJSBridgeReady', onBridgeReady(data));
        }
      } else {
        onBridgeReady(data);
      }
    }

    function onBridgeReady(data) {
        WeixinJSBridge.invoke(
          'getBrandWCPayRequest', {
             // 傳入第一步后端接口返回的核心參數(shù)
            "appId": data.appId, //公眾號
            "timeStamp": data.timeStamp, //時間戳
            "nonceStr": data.nonceStr, //隨機(jī)串
            "package": data.package, //prepay_id
            "signType": data.signType, //微信簽名方式RSA
            "paySign": data.paySign //微信簽名
          },
          function(res) {
            // 支付成功
            if (res.err_msg == "get_brand_wcpay_request:ok") {
              // 使用以上方式判斷前端返回,微信團(tuán)隊(duì)鄭重提示:
              //res.err_msg將在用戶支付成功后返回ok,但并不保證它絕對可靠。
            }
            // 支付過程中用戶取消
            if (res.err_msg == "get_brand_wcpay_request:cancel") {

            }
            // 支付失敗
            if (res.err_msg == "get_brand_wcpay_request:fail") {

            }
            /**
            * 其它
            * 1、請檢查預(yù)支付會話標(biāo)識prepay_id是否已失效
            * 2、請求的appid與下單接口的appid是否一致
            * */
            if (res.err_msg == "調(diào)用支付JSAPI缺少參數(shù):total_fee") {

            }
          });
      }

  • 微信公眾號的JSSDK中的wx.chooseWXPay: JS-SDK說明文檔;注意:目前官方文檔取消了chooseWXPay接口,而是推薦JSAPI支付;
  • 在項(xiàng)目中需要引入jweixin文件:http://res.wx.qq.com/open/js/jweixin-1.6.0.js
    或者通過npm i jweixin-module使用jWeixin對象;
  • 通過config接口注入權(quán)限驗(yàn)證配置;
//調(diào)用后端接口獲取配置參數(shù)
uni.request({
  url: '后端接口地址,獲取驗(yàn)證配置',
  method: 'POST',
  data: { 傳入接口需要的參數(shù),如頁面路徑url },
  success({data}) {
    //注入權(quán)限驗(yàn)證配置
    jWeixin.config({
      debug: false, // 開啟調(diào)試模式,調(diào)用的所有api的返回值會在客戶端alert出來,若要查看傳入的參數(shù),可以在pc端打開,參數(shù)信息會通過log打出,僅在pc端時才會打印。(測試記得關(guān)掉)
      appId: data.appId, // 公眾號的唯一標(biāo)識
      timestamp: data.timestamp, // 生成簽名的時間戳
      nonceStr: data.nonceStr, // 生成簽名的隨機(jī)串
      signature: data.signature, // 簽名
      jsApiList: ['chooseWXPay'], // JS接口列表
    })
  }
})
  • 通過ready接口處理成功驗(yàn)證,調(diào)用支付;
    jWeixin.ready(function () {
    // config信息驗(yàn)證后會執(zhí)行ready方法,所有接口調(diào)用都必須在config接口獲得結(jié)果之后,config是一個客戶端的異步操作,所以如果需要在頁面加載時就調(diào)用相關(guān)接口,則須把相關(guān)接口放在ready函數(shù)中調(diào)用來確保正確執(zhí)行。對于用戶觸發(fā)時才調(diào)用的接口,則可以直接調(diào)用,不需要放在ready函數(shù)中。
      jWeixin.chooseWXPay({
        timestamp: data.timeStamp,
        package: data.package,
        nonceStr: data.nonceStr,
        signType: data.signType,
        paySign: data.paySign,
        success: function (res: any) {
          if (res.errMsg == "chooseWXPay:ok") {
            console.log('支付成功')
          } else {
           console.log('支付失敗')
        },
        fail: function (res: any) {
          console.log('支付失敗')
        },
      });
    });

三、app小程序支付

App支付適用于在移動端App中集成微信支付功能的場景。商戶App調(diào)用微信提供的SDK調(diào)用微信支付模塊,商戶App會跳轉(zhuǎn)到微信中完成支付,支付完后跳回到商戶App內(nèi),最后展示支付結(jié)果。具體操作流程如下(流程與小程序類似):

  • 登錄獲取openId后,創(chuàng)建訂單獲取訂單ID;(這里需要注意的是使用uni.login喚起微信登錄需要在manifest.json進(jìn)行相關(guān)配置: 鏈接查看
//登錄
uni.login({
	"provider": "weixin",
	success: function(event){
		// 登錄成功,獲取openid
		const {openid,access_token}= event.authResult
		//獲取用戶信息
        uni.getUserInfo({
            provider: 'weixin',
            success: function(info) {
                // 獲取用戶信息成功, 調(diào)用后端接口進(jìn)行完成登錄
            }
        })
	},
	fail: function (err) {
        // 登錄授權(quán)失敗
        // err.code是錯誤碼
    }
})

//登錄成功后在下單時創(chuàng)建訂單
```javascript
uni.request({
  url: '后端接口地址,獲取訂單id',
  method: 'POST',
  data: { 傳入接口需要的參數(shù),如商品金額,商品個數(shù)等 },
  success(res) {
    console.log(res.data.orderId)
  }
})
  • 調(diào)用后端接口獲取支付核心參數(shù),預(yù)支付;
uni.request({
  url: '后端接口地址,獲取支付核心數(shù)據(jù)',
  method: 'POST',
  data: { 傳入接口需要的參數(shù),如訂單ID等 },
  success(res) {
    console.log(res.data)
    //接口會返回以下核心參數(shù)
    //timeStamp 時間戳
    //nonceStr  隨機(jī)字符串
    //package   統(tǒng)一下單接口返回的 prepay_id 參數(shù)值
    //signType  簽名算法
    //paySign   簽名

    //通過下方api發(fā)起支付
  }
})
  • 調(diào)用uni.requestPayment()發(fā)起支付:支付平臺功能申請 -> manifest.json 里配置支付參數(shù) -> uni-app 里調(diào)用 API 進(jìn)行支付 官網(wǎng)流程閱讀
uni.requestPayment({
    provider: 'wxpay',
    orderInfo: data.orderInfo, //微信、支付寶訂單數(shù)據(jù) 【注意微信的訂單信息,鍵值應(yīng)該全部是小寫,不能采用駝峰命名】
    nonceStr: data.noncestr,
    package: data.package,
    timeStamp: data.timestamp,
    signType: data.signType,
    paySign: data.paySign,
    success: function (res) {
        if (e.errMsg == "requestPayment:ok") {
          console.log('支付成功')
        }else{
          console.log('支付失敗')
        }
    },
    fail: function (err) {
        console.log('支付失敗:' + JSON.stringify(err));
    }
});

總結(jié)

  • 登錄:調(diào)用uni.login/wx.login調(diào)用微信接口,獲取code,調(diào)用后端后臺獲取openid;
  • 訂單:調(diào)用后端接口獲取訂單ID,再調(diào)用后端接口傳入openid、商品id、商品單價、商品數(shù)量等參數(shù)獲取預(yù)支付的重要參數(shù)(時間戳timeStamp,隨機(jī)字符串nonceStr,預(yù)支付id package,簽名算法signType,簽名paySign)
  • 支付:調(diào)用uni/wx.requestPayment微信支付方法,傳遞5個重要參數(shù),獲取支付結(jié)果(成功或失敗)
  • H5支付因?yàn)闊o法直接調(diào)用微信api,需要通過JSSDK配置后調(diào)用對應(yīng)的接口;

在開發(fā)中如果涉及到多端支付,需要通過條件編譯處理多端差異,可以參考 官網(wǎng)文檔,在實(shí)際開發(fā)中可以多參考各位大佬的文檔找到適合自己項(xiàng)目開發(fā)的方法,也歡迎各位大佬討論、提供建議補(bǔ)充…

到此這篇關(guān)于uniapp前端實(shí)現(xiàn)微信支付功能的文章就介紹到這了,更多相關(guān)uniapp前端微信支付內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • vue編譯打包本地查看index文件的方法

    vue編譯打包本地查看index文件的方法

    下面小編就為大家分享一篇vue編譯打包本地查看index文件的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-02-02
  • vue中watch和computed的區(qū)別詳解

    vue中watch和computed的區(qū)別詳解

    這篇文章主要給大家介紹了關(guān)于vue中watch和computed區(qū)別的相關(guān)資料,computed和watch都是vue框架中的用于監(jiān)聽數(shù)據(jù)變化的屬性,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-11-11
  • Vue+Echarts封裝成組件使用及說明

    Vue+Echarts封裝成組件使用及說明

    文章總結(jié)了將Vue和Echarts封裝成組件的經(jīng)驗(yàn),強(qiáng)調(diào)了組件的自適應(yīng)功能,作者希望這個經(jīng)驗(yàn)對大家有所幫助,并鼓勵大家支持腳本之家
    2025-12-12
  • Nuxt.js實(shí)戰(zhàn)詳解

    Nuxt.js實(shí)戰(zhàn)詳解

    這篇文章主要介紹了Nuxt.js實(shí)戰(zhàn)詳解,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-01-01
  • vue項(xiàng)目前端埋點(diǎn)的實(shí)現(xiàn)

    vue項(xiàng)目前端埋點(diǎn)的實(shí)現(xiàn)

    這篇文章主要介紹了vue項(xiàng)目前端埋點(diǎn)的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-03-03
  • 在Vue3項(xiàng)目中優(yōu)化使用ECharts的完整方案

    在Vue3項(xiàng)目中優(yōu)化使用ECharts的完整方案

    在Vue3項(xiàng)目中使用 ECharts,如何做到按需打包、類型安全、響應(yīng)式適配、自動銷毀?本文分享一套可直接落地的封裝方案,需要的朋友可以參考下
    2026-05-05
  • Vue3如何解決Element-plus不生效的問題

    Vue3如何解決Element-plus不生效的問題

    這篇文章主要介紹了Vue3如何解決Element-plus不生效的問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-03-03
  • vue如何使用cookie、localStorage和sessionStorage進(jìn)行儲存數(shù)據(jù)

    vue如何使用cookie、localStorage和sessionStorage進(jìn)行儲存數(shù)據(jù)

    這篇文章主要介紹了vue如何使用cookie、localStorage和sessionStorage進(jìn)行儲存數(shù)據(jù),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-08-08
  • Vue3中pinia用法示例

    Vue3中pinia用法示例

    這篇文章主要介紹了Vue3中使用pinia,本文通過示例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-07-07
  • Element-ui Image圖片按需引入大圖預(yù)覽

    Element-ui Image圖片按需引入大圖預(yù)覽

    這篇文章主要為大家介紹了Element-ui Image圖片按需引入大圖預(yù)覽實(shí)現(xiàn)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-07-07

最新評論

新蔡县| 宜州市| 石狮市| 砀山县| 莆田市| 随州市| 迁安市| 壶关县| 永修县| 丽江市| 格尔木市| 阜南县| 宝丰县| 花垣县| 乐昌市| 广宁县| 千阳县| 麟游县| 盐边县| 合川市| 郧西县| 藁城市| 商洛市| 平邑县| 信丰县| 彭阳县| 沙田区| 民乐县| 宕昌县| 抚松县| 佛教| 云林县| 城固县| 明水县| 沅江市| 贡山| 襄城县| 天峻县| 哈尔滨市| 南溪县| 民丰县|