支付寶小程序插件 插件后端開(kāi)發(fā)

2020-09-18 14:28 更新

背景

插件不能獨(dú)立運(yùn)行,必須依附在其他的主體小程序上。目前插件背后對(duì)應(yīng)一個(gè)三方應(yīng)用,當(dāng)插件需要獲取商戶擁有的支付寶能力的時(shí)候,必須代商戶調(diào)用支付寶接口,所以插件服務(wù)端最重要的概念就是 代調(diào)用。

img

服務(wù)端開(kāi)發(fā)準(zhǔn)備

插件服務(wù)端開(kāi)發(fā)需要下載支付寶服務(wù)端SDK。

插件代調(diào)用

  1. 插件代替商家來(lái)調(diào)用支付寶能力時(shí)候,需要獲得商家授權(quán)發(fā)送 app_auth_code 換取 app_auth_token。授權(quán)消息相關(guān)操作請(qǐng)參見(jiàn) 插件授權(quán),完成消息處理后請(qǐng)配送應(yīng)用網(wǎng)關(guān)。
  2. 商家授權(quán)是授權(quán)商家下面某一個(gè)應(yīng)用給插件代調(diào)用,所以插件服務(wù)端需要建立 PID - auth_app_id - app_auth_token 三者唯一關(guān)系。
  3. 當(dāng)插件代理商家獲取用戶信息時(shí)候,需要用戶授權(quán)發(fā)送 auth_code 給插件代理?yè)Q取 access_token,最終用 app_id(三方應(yīng)用id) + app_auth_token + access_token 請(qǐng)求接口獲得用戶信息。

獲得 app_auth_token

app_auth_token:第三方應(yīng)用授權(quán)獲取的 token,用于 ISV 代商戶發(fā)起請(qǐng)求。

當(dāng)商家訂購(gòu)插件時(shí),會(huì)授權(quán)三方應(yīng)用行使代調(diào)用權(quán)限,app_auth_token 回調(diào)發(fā)送給插件所屬三方應(yīng)用的網(wǎng)關(guān)。在聯(lián)調(diào)獲取 app_auth_token 前,必須配置完成 應(yīng)用網(wǎng)關(guān)、授權(quán)回調(diào)地址。

app_auth_token 回調(diào)以下信息發(fā)送網(wǎng)關(guān):

  • ISV 發(fā)起授權(quán)
  • 下單消息:商戶完成訂購(gòu)插件后服務(wù)商收到的關(guān)于商戶的相關(guān)訂單消息。

image.png

配置應(yīng)用網(wǎng)關(guān)、授權(quán)回調(diào)地址

  • 應(yīng)用網(wǎng)關(guān):用于接收支付寶異步通知,例如口碑開(kāi)店中,需要配置此網(wǎng)關(guān)來(lái)接收開(kāi)發(fā)者門(mén)店被動(dòng)通知;
  • 授權(quán)回調(diào)地址: 第三方授權(quán)或用戶信息授權(quán)后回調(diào)地址。授權(quán)鏈接中配置的 redirect_uri 的值必須與此值保持一致。

img

在配置完成 應(yīng)用網(wǎng)關(guān)、授權(quán)回調(diào)地址 后,增加或刪除應(yīng)用功能包,都會(huì)推送最新的 app_auth_token 給插件服務(wù)端,采用這種方式可以驗(yàn)證模擬商戶訂購(gòu)插件回調(diào) app_auth_token 的過(guò)程。

img

獲得 app_auth_token 的兩種方法

方法一:商家訂購(gòu)插件,app_auth_token 回調(diào)發(fā)送給插件所屬三方應(yīng)用的應(yīng)用網(wǎng)關(guān)。

方法二:在第三方應(yīng)用的 商家授權(quán)應(yīng)用 > 插件授權(quán)應(yīng)用 中查找對(duì)應(yīng)的 app_auth_token。

img

獲得 auth_token

auth_token:用戶信息授權(quán)獲取的token,用于獲取用戶信息。

使用插件用戶授權(quán),獲取用戶的 auth_code,再換取 auth_token。

獲得 auth_code

獲取 auth_code 詳情請(qǐng)參考 用戶授權(quán)。

通過(guò)auth_code 換取 auth_token

//三方應(yīng)用開(kāi)發(fā)者私鑰,由開(kāi)發(fā)者自己生成 參考 https://docs.open.alipay.com/200/105310#s2
String appPrivateKey = "MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCKnImlg1tZYi4UBFwk3A4L3LjuAy";
//支付寶公鑰,由支付寶生成
String alipayPublicKey = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4r6vW";
String format = "json";
String charset = "UTF-8";
String signType = "RSA2"; //商戶生成簽名字符串所使用的簽名算法類型,目前支持RSA2和RSA,推薦使用RSA2
String serverUrl = "https://openapi.alipay.com/gateway.do";
String appId = "2018071660683196"; //三方應(yīng)用id 保證應(yīng)用已經(jīng)上線了
String appAuthToken = "1cc19911172e4f8aaa509c8fb5d12F56"; //商戶授權(quán)token https://docs.open.alipay.com/20160728150111277227/intro
String authCode = "bc95009acbe1401cabec35cece99SC12"; // 用戶授權(quán)碼


AlipayClient alipayClient = new DefaultAlipayClient(serverUrl, appId, appPrivateKey, format, charset, alipayPublicKey, signType);
try {
    AlipaySystemOauthTokenRequest request = new AlipaySystemOauthTokenRequest();
    request.setGrantType("authorization_code");
    request.setCode(authCode);
    AlipaySystemOauthTokenResponse response = alipayClient.execute(request, null, appAuthToken);
    System.out.println(response.getAccessToken());
} catch (AlipayApiException e) {
    e.printStackTrace();
}

代調(diào)用獲取用戶信息

簡(jiǎn)單說(shuō)代調(diào)用獲取用戶信息,是利用 app_id(三方應(yīng)用id) + app_auth_token+access_token 調(diào)用接口獲取用戶信息。

//三方應(yīng)用開(kāi)發(fā)者私鑰,由開(kāi)發(fā)者自己生成 參考 https://docs.open.alipay.com/200/105310#s2
String appPrivateKey = "MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCKnImlg1tZYi4UBFwk3A4L3LjuAy";
//支付寶公鑰,由支付寶生成
String alipayPublicKey = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4r6vW";
String format = "json";
String charset = "UTF-8";
String signType = "RSA2"; //商戶生成簽名字符串所使用的簽名算法類型,目前支持RSA2和RSA,推薦使用RSA2
String serverUrl = "https://openapi.alipay.com/gateway.do";
String appId = "2018071660683196"; //三方應(yīng)用id 保證應(yīng)用已經(jīng)上線了
String appAuthToken = "1cc19911172e4f8aaa509c8fb5d12F56"; //商戶授權(quán)token https://docs.open.alipay.com/20160728150111277227/intro
String accessToken = "22c19911172e4f8aaa509c8fb5d12F56"; //用戶授權(quán)token


AlipayClient alipayClient = new DefaultAlipayClient(serverUrl, appId, appPrivateKey, format, charset, alipayPublicKey, signType);
try {
    AlipayUserInfoShareRequest request = new AlipayUserInfoShareRequest();
    AlipayUserInfoShareResponse response = alipayClient.execute(request, accessToken, appAuthToken);
    response.getUserId();
    response.getUserName();
} catch (AlipayApiException e) {
    e.printStackTrace();
}
以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)