支付寶小程序插件 插件授權(quán)

2020-09-18 14:28 更新

插件授權(quán)的說(shuō)明

與 第三方應(yīng)用授權(quán) 場(chǎng)景下由 ISV 主動(dòng)引導(dǎo)商戶進(jìn)行授權(quán)流程不同,小程序插件場(chǎng)景下的授權(quán)動(dòng)作由商戶在服務(wù)市場(chǎng)的訂購(gòu)行為觸發(fā)。在商戶訂購(gòu)后支付寶服務(wù)端會(huì)通過(guò) Http 協(xié)議發(fā)送一個(gè)授權(quán)消息到三方應(yīng)用所配置的插件應(yīng)用,該授權(quán)主要為應(yīng)用網(wǎng)關(guān)配送。請(qǐng)按照本文的要求正確處理該通知,處理完后請(qǐng)參見(jiàn) 插件后端開(kāi)發(fā) 獲取 app_auth_token。

插件授權(quán)消息說(shuō)明

報(bào)文示例

注意:實(shí)際收到的是 POST 請(qǐng)求,參數(shù)在 Post Body 中。

ISV_GATEWAY_URL?****&Data={"headers":{"User-Agent":"Mozilla/4.0","Content-Type":"application/x-www-form-urlencoded; charset=UTF-8"},"data":{"notify_type":"open_app_auth_notify","charset":"UTF-8","biz_content":"{\\"notify_context\\":{\\"trigger\\":\\"appstore\\"},\\"detail\\":{\\"app_auth_token\\":\\"202004BB9d3901a7d39d4350a49fb00000000001\\",\\"user_id\\":\\"20881200000000002\\",\\"re_expires_in\\":32140800,\\"auth_time\\":1587573752655,\\"app_refresh_token\\":\\"202004BB81e2730b7ecc4295a551e00000000001\\",\\"auth_app_id\\":\\"20210000002\\",\\"app_id\\":\\"20190000000\\",\\"expires_in\\":31536000,\\"app_auth_code\\":\\"fa861f9d7032404bae53f54247000001\\"},\\"error\\":{}}","notify_time":"2020-04-23 00:42:32","sign":"****","auth_app_id":"2021000000000002","app_id":"2019000000000000","version":"1.0","sign_type":"RSA2","notify_id":"2020042300222004232009800000000007","status":"execute_auth"},"method":"POST","pid":"2088500000000002","url":"https://*****/gateway.do","timeout":16000}

協(xié)議參數(shù)說(shuō)明

字段名 必填 字段說(shuō)明 備注
notify_id 通知校驗(yàn) ID,唯一標(biāo)識(shí)一筆通知 相同 notify_id 稱之為同一筆通知
notify_type 通知類型 插件授權(quán)時(shí)的值固定為:open_app_auth_notify
status 業(yè)務(wù)狀態(tài) 插件授權(quán)時(shí)值固定為:execute_auth
notify_time 通知發(fā)送時(shí)間 UTC+8,格式為 yyyy-MM-dd HH:mm:ss。若為其它時(shí)區(qū)的服務(wù)器時(shí)間請(qǐng)自行轉(zhuǎn)換
charset 字符集 該字符集用于開(kāi)發(fā)者對(duì)收到的報(bào)文進(jìn)行驗(yàn)簽使用
version 版本號(hào) 目前固定為 1.0,商戶僅應(yīng)該識(shí)別 version 參數(shù)為空或者 version=1.0 的通知報(bào)文,其它應(yīng)該拒絕
app_id 接收通知的 app_id 該 app_id 是本消息的接收方。
auth_app_id 授權(quán)業(yè)務(wù)主體的 appId 在插件授權(quán)場(chǎng)景下無(wú)此參數(shù),開(kāi)發(fā)者不用關(guān)心
sign 簽名 支付寶的簽名值
sign_type 簽名類型 簽名算法,目前支持 RSA2 簽名算法。注意,該參數(shù)不參與驗(yàn)簽。
biz_content 該筆通知的業(yè)務(wù)內(nèi)容 本次授權(quán)動(dòng)作的詳細(xì)信息。詳細(xì)說(shuō)明參見(jiàn)下文對(duì)于 biz_content 的說(shuō)明

biz_content 說(shuō)明

示例如下(為了展示方便,示例對(duì) JSON 展示進(jìn)行了格式化處理)

"data":


    {"notify_type":"open_app_auth_notify",


     "charset":"UTF-8",


     "biz_content":"{


         \\"notify_context\\":{\\"trigger\\":\\"appstore\\"},


         \\"detail\\":{


               \\"app_auth_token\\":\\"202004BB9d3901a7d39d4350a49fb00000000001\\",


               \\"user_id\\":\\"20881200000000002\\",


               \\"re_expires_in\\":32140800,


               \\"auth_time\\":1587573752655,


               \\"app_refresh_token\\":\\"202004BB81e2730b7ecc4295a551e00000000001\\",


               \\"auth_app_id\\":\\"20210000002\\",


               \\"app_id\\":\\"20190000000\\",


               \\"expires_in\\":31536000,


               \\"app_auth_code\\":\\"fa861f9d7032404bae53f54247000001\\"


                        },


         \\"error\\":{}


      }",


     "notify_time":"2020-04-23 00:42:32",


     "sign":"****","auth_app_id":"2021000000000002",


     "app_id":"2019000000000000",


     "version":"1.0",


     "sign_type":"RSA2",


     "notify_id":"2020042300222004232009800000000007",


     "status":"execute_auth"


    }
  • detail:授權(quán)的詳細(xì)信息
參數(shù)名 類型 最大長(zhǎng)度 必填 描述 范例
app_id String 32 被授權(quán)方應(yīng)用 id,在插件授權(quán)場(chǎng)景下為插件的 ID。 2015072100001111
auth_app_id String 32 授權(quán)方的應(yīng)用 id,在插件授權(quán)場(chǎng)景下指商戶的 app_id。 2014072300002222
auth_time String 20 授權(quán)發(fā)生時(shí)間(自1970年1月1日零點(diǎn)算起的毫秒數(shù)),在插件授權(quán)場(chǎng)景下指商戶訂購(gòu)時(shí)觸發(fā)授權(quán)的時(shí)間。通知接受方需要根據(jù)auth_time做令牌冪等。 1491746302568
app_auth_code String 32 (兼容用)應(yīng)用授權(quán)碼,該參數(shù)提供給開(kāi)發(fā)者用于兼容開(kāi)發(fā)者頁(yè)面授權(quán)的換碼邏輯,新接入方推薦直接使用報(bào)文中的 app_auth_token 即可。 252a889e49af4e6cbtests17ae053X80
app_auth_token String 40 應(yīng)用授權(quán)令牌。 201603BB6e8df928test473d9d4c94d57d5c0X00
expires_in String 16 (廢棄字段)目前應(yīng)用授權(quán)訪問(wèn)令牌的有效期為永久(商戶主動(dòng)取消授權(quán)的情況下仍未將令牌置為無(wú)效)。刷新機(jī)制繼續(xù)保留,開(kāi)發(fā)者根據(jù)自己的存儲(chǔ)安全性自行決定刷新時(shí)間。 123456
app_refresh_token String 40 刷新令牌。開(kāi)發(fā)者可以通過(guò)調(diào)用 alipay.open.auth.token.app 接口進(jìn)行 app_auth_token 的刷新。 201603BBdeb7d0ab1testbe898432a6490dfbX00
re_expires_in String 16 (廢棄字段)目前應(yīng)用授權(quán)的刷新令牌有效期為永久(商戶主動(dòng)取消授權(quán)的情況下仍未將令牌置為無(wú)效)。 123456
user_id String 16 授權(quán)商戶的 user_id。 授權(quán)商戶的 user_id
agent_app_id String 32 三方應(yīng)用 id。插件授權(quán)的場(chǎng)景下有值,是插件歸屬的三方應(yīng)用的 ID。 2014072300003333

  • notfy_context:本次授權(quán)關(guān)聯(lián)的一些上下文信息(開(kāi)發(fā)者可以忽略)
參數(shù)名 類型 最大長(zhǎng)度 必填 描述 范例
trigger String 30 授權(quán)觸發(fā)環(huán)境,插件訂購(gòu)場(chǎng)景下為 appstore,開(kāi)發(fā)者無(wú)需關(guān)注 appstore
trigger_context String 1000 trigger_contexttrigger 相關(guān)聯(lián)的上下文,開(kāi)發(fā)者無(wú)需關(guān)注 目前值為空

  • error:授權(quán)過(guò)程中出現(xiàn)的異常情況(開(kāi)發(fā)者可忽略,后續(xù)該字段會(huì)廢棄)

參數(shù)名 類型 最大長(zhǎng)度 必填 描述 范例
appstore_online_pay String 20 特殊情況下的錯(cuò)誤信息,大部分開(kāi)發(fā)者無(wú)需關(guān)心。若 ISV 簽約了“在線購(gòu)買(mǎi)/口碑商品”產(chǎn)品且該產(chǎn)品的授權(quán)前置條件不滿足則會(huì)有該值。 LACK_FACE_TO_FACE

appstore_online_pay 的可選取值如下:

錯(cuò)誤碼 ISV ISV 該怎么做
FAIL 系統(tǒng)錯(cuò)誤,由于未知原因?qū)е碌南到y(tǒng)錯(cuò)誤 建議聯(lián)系引導(dǎo)商戶重新授權(quán)解決來(lái)解決
UNEXPECTED_CERTIFY_GRADE 商戶的個(gè)人認(rèn)證等級(jí)不夠 通知聯(lián)系引導(dǎo)商戶完成實(shí)名認(rèn)證,再重新授權(quán)。注:個(gè)人用戶完成個(gè)人實(shí)名認(rèn)證,企業(yè)用戶完成企業(yè)實(shí)名認(rèn)證。
MERCHANT_DISCARD 商戶已經(jīng)被清退;被清退的商戶無(wú)法進(jìn)行簽約和發(fā)布商品 -
LACK_FACE_TO_FACE 商戶未簽約當(dāng)面付 建議聯(lián)系引導(dǎo)商戶完成口碑開(kāi)店流程之后,再重新授權(quán)

開(kāi)發(fā)者處理邏輯說(shuō)明

根據(jù)授權(quán)主體進(jìn)行授權(quán)令牌存儲(chǔ)

授權(quán)主體表示授權(quán)令牌的參與方,區(qū)別于第三方應(yīng)用授權(quán)的授權(quán)主體(授權(quán)關(guān)系建立在商戶 app_id 和三方應(yīng)用的 app_id 的二者),插件授權(quán)的授權(quán)主體新增了插件維度的信息,即:商戶 app_id、 三方應(yīng)用 app_id 和插件 ID 三者之間的授權(quán)關(guān)系。開(kāi)發(fā)者保存插件授權(quán)令牌的情況下特別需要注意以下幾點(diǎn):

  1. 令牌存儲(chǔ)(包括訪問(wèn)令牌和刷新令牌)需要有插件 ID 維度的信息,否則若三方應(yīng)用同時(shí)開(kāi)發(fā)多個(gè)插件,商戶同時(shí)訂購(gòu)了這些插件,會(huì)存在不同插件的令牌相互覆蓋的問(wèn)題。
  2. 令牌存儲(chǔ)(包括訪問(wèn)令牌和刷新令牌)需要有商戶 app_id 維度的信息,不能用商戶 uid,否則若商戶名下多個(gè)小程序同時(shí)使用同一個(gè)插件的時(shí)候,會(huì)出現(xiàn)商戶不同商戶小程序的令牌相互覆蓋的問(wèn)題。
  3. 令牌存儲(chǔ)需要存儲(chǔ) auth_time,用于保證授權(quán)令牌的最終一致性。

授權(quán)消息處理

1.消息處理 插件授權(quán)消息為老版本的開(kāi)放平臺(tái)消息,通過(guò)以下方式確認(rèn)為插件授權(quán)消息(同時(shí)滿足以下條件)。

  • notify_type=open_app_auth_notify
  • status=execute_auth
  • agent_app_id 非空

2.授權(quán)消息的最終一致性

考慮下述原因,若 授權(quán)主體 一致,開(kāi)發(fā)者需要根據(jù) auth_time 保證令牌的最終一致性。

  • 在極少的特殊操作情況下存在商戶短時(shí)間進(jìn)行多次授權(quán)的情況;
  • 由于網(wǎng)絡(luò)延遲原因開(kāi)發(fā)者接受到授權(quán)消息的時(shí)間并不一定是授權(quán)發(fā)生。
以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

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

編程獅公眾號(hào)