博客 / 詳情

返回

小程序開發實戰案例之二|如何實現小程序支付

上一章講完如何獲取用户信息授權 後,下一步就可以進行小程序支付了。

本期就來介紹下支付寶小程序支付如何實現。

image.png

PS:接入前的準備工作可以參考:接入準備;接入指南可參考:接入指南~

獲取小程序支付權限

獲取權限分為三步:分別是 賬號開通 JSAPI 支付賬號與小程序賬號綁定 以及 小程序綁定 JSAPI 產品


賬號開通 JSAPI 支付

需要用收款主體賬號去簽約,賬號要求必須是企業或者是個體工商户。

可以直接通過 👉 簽約直通車 進行開通
image.png

賬號與小程序賬號綁定

開通成功之後,要去 小程序 AppID 管理 頁面關聯小程序,將開發的小程序關聯到賬號下。

注意:哪個小程序開發就綁哪個小程序,不綁的話後面無法支付成功。
image.png


小程序綁定JSAPI產品

要到小程序詳情界面的【產品綁定】去綁 JSAPI 支付產品。

可以參考 👉 [應用如何實現產品綁定] 進行操作:

image.png


簽約過程中可能遇到的問題也給大家列在這裏了,大家可以參考下~:

  • [小程序功能列表中沒有支付能力]
  • [個人小程序是否支持支付功能]
  • [小程序支付簽約要求]

小貼士 📖 賬號不符合要求的也可以通過沙箱環境去測試下,可以參考之前寫的這篇~

支付寶沙箱超詳細教程+避雷經驗,看這篇就夠了

支付調用整體流程

獲取到權限之後我們就可以進行接口調用了,主要步驟分為 :

  • (前端+後端)獲取用户的授權信息
  • (前端)將訂單信息傳到服務端
  • (後端)服務端創建支付單
  • (前端)喚起支付

第一步、獲取用户的授權信息

目的: 這一步是為了能夠獲取到用户的 user_id(openid)

注意: user_id 和 openid 都是可以的,新老賬號可能獲取到的信息不一樣,我之前老的賬號獲取到的是user_id,新申請的賬號獲取到的是 openid,根據大家的自己賬號實際情況來看~

對此內容感興趣的小夥伴也可以查看 👉[openid 和 userid 的區別]


方法一:通過用户授權獲取(用户端有彈窗)

大家可以參考我之前寫的獲取用户信息的 my.getAuthCode 步驟,下面簡單概括下就是:

  • 前端通過 my.getAuthCode 方法獲取到用户的授權 authCode
  • authCode 傳到後端通過 alipay.system.oauth.token 接口獲取 access_token 參數
  • 後端用 access_token 參數傳入 alipay.user.info.share 接口中獲取到 user_id(openid)


    方法二:通過靜默授權獲取(用户端無彈窗)

靜默授權與用户授權同樣是使用的 my.getAuthCode 方法,但是 scopes 傳參不同,獲取到的信息 只有 uid(openid) ,調用步驟為:

  • 前端通過 my.getAuthCode 方法(scopes 入參 auth_base)獲取到用户的授權 authCode
  • authCode 傳到後端通過 alipay.system.oauth.token 接口到 user_id(openid)

代碼示例

Page({
  getAuthCode() {
    my.getAuthCode({
      scopes: 'auth_base',//靜默授權
      success: res => {
        const authCode = res.authCode;
      fail: err => {
        console.log('my.getAuthCode 調用失敗', err)
      }
    });
  }
})

授權這塊的問題在上一篇 已經説過很多了,這次再補充兩個關於靜默授權的問題:**

  • [小程序靜默授權是否可以拿到用户頭像暱稱]
  • [支付寶小程序可以在首頁獲取到user_id嗎]

第二步、將訂單信息傳到服務端

用户信息獲取到之後,我們就可以將訂單信息和用户信息一起再打包,通過 my.request 傳回服務端

//.js頁面
Page({
  pay(){
    my.request({
      url: '商家服務端地址',//須加httpRequest域白名單
      method: 'POST',
      data: {//data裏的key、value是開發者自定義的
        from: '支付寶',
        order: 'XXXXX',//訂單信息
      },
      dataType: 'json',
      success: function(res) {
        my.alert({content: 'success'});
      },
      fail: function(res) {
        my.alert({content: 'fail'});
      },
      complete: function(res) {
        my.hideLoading();
        my.alert({content: 'complete'});
      }
    });
  }
});

如果是在本地測試的話記得在 IDE 的【詳情】裏面把下面這兩個校驗勾選上,不然IDE會去校驗域名的合法性的。

image.png

這邊給大家彙總一些 my.request 調用過程中的常見問題:

  • [my.request API 可以使用 ip 地址訪問嗎]
  • [my.request 的 url 參數的域名是否需要配置白名單]
  • [my.request 默認請求頭]
  • [my.request 默認請求超時是多久]

第三步、服務端創建支付單

目的: 獲取 trade_no(支付寶交易號)

接收到前端傳過來的訂單信息之後,需要將信息傳入 alipay.trade.create 接口中獲取 trade_no。

服務端的代碼大家可以直接參考:👉 [alipay.trade.create 代碼示例]

📌下面簡單列一下後端幾個必傳的參數:

  • out_trade_no: 商户端自定義訂單號,需保證在商户端的唯一性。
  • total_amount: 訂單金額,單位元,精確到兩位小數。
  • subject: 訂單標題,會在賬單界面展示。
  • product_code: 產品碼,固定值 JSAPI_PAY。
  • op_app_id: 傳小程序appid。

如果獲取到的是user_id,傳入

  • buyer_id: 傳入之前獲取到的user_id。

如果獲取到的是openid,傳入

  • buyer_open_id: 傳入之前獲取到的openid。

後端接口調用成功之後就可以獲取到 trade_no 參數了:

image.png

服務端接口報錯的常見問題如下:

  • [小程序支付報錯:ACCESS_FORBIDDEN]
  • [小程序支付報錯:本筆交易不支持在本小程序內支付請聯繫商户完成小程序 APPID 的綁定後再重新發起支付]
  • [ACQ.UNBOUND_APPLICATION(指定小程序主體未完成關聯綁定)]
  • [小程序支付報錯:支付失敗,商家支付喚起方式不正確,請聯繫商家解決]

第四步、喚起支付

前端獲取到 trade_no 之後,我們就可以通過 my.tradePay(發起支付) 方法在小程序上喚起收銀台了。

// .js
my.tradePay({
  // 傳入支付寶交易號trade_no
  tradeNO: '201711152100110410533667792',
  success: (res) => {
    my.alert({
      content: JSON.stringify(res),
    });
  },
  fail: (res) => {
    my.alert({
      content: JSON.stringify(res),
    });
  }
});

如果是 IDE 上測試的話,需要用支付寶掃碼進行支付:

image.png

真機測試可以直接喚起收銀台進行支付:
image.png

大家也可以看下支付過程中可能會遇到的一些問題~:

  • [小程序前端跳轉是否可以判斷支付成功]
  • [小程序開發者工具是否在支持測試小程序支付功能]
  • [小程序支付如何設置同步]
  • [小程序支付報錯:當面付等產品不支持在小程序場景內使用,請聯繫商户更換收單產品後再重新發起支付]

以上就是小程序支付的所有內容了,希望能夠幫助到你★,°:.☆( ̄▽ ̄)/$:.°★

user avatar
0 位用戶收藏了這個故事!

發佈 評論

Some HTML is okay.