芝麻信用商家接入指南
很久都沒動(dòng)筆寫博客了,原因有2,第一是自己太懶了,第二是因?yàn)榇_實(shí)沒什么好寫的,因?yàn)橐恢苯佑|新技術(shù)的機(jī)會(huì)比較少,這次正好又逢2017年開始,所以寫下博客,記錄下自己的一些點(diǎn)點(diǎn)滴滴,以后有用的時(shí)候可以翻過來看看。
這一部分在這篇文檔中有詳細(xì)的介紹,因?yàn)楣酒鋵?shí)是有其他人把這一步做好的,這一步主要是業(yè)務(wù)洽談,公司的業(yè)務(wù)部門會(huì)去申請(qǐng)一系列的準(zhǔn)入憑證,一般來說不管是芝麻信用還用其他的一些API接口,大到比如QQ互聯(lián),小到公司內(nèi)部對(duì)外暴露的一些小的接口,都會(huì)包含如下幾個(gè)要素:
應(yīng)用公鑰
應(yīng)用私鑰
請(qǐng)求公共URL
請(qǐng)求接口方法名
有興趣的可以自己去百度一下,這里就不做詳細(xì)的介紹了,其實(shí)對(duì)于芝麻信用的話,上面4條也是必須的,那么芝麻對(duì)于API接口的定義,官方的解釋如下:
目前芝麻信用開放平臺(tái)支持兩種類型的接口,一種是系統(tǒng)調(diào)用類接口,主要是商戶后端直接通過HTTP的方式進(jìn)行接口調(diào)用,并同步返回結(jié)果給商戶。另外一種是頁(yè)面跳轉(zhuǎn)類接口,這種接口的用法是商戶在瀏覽器中輸入芝麻信用開放平臺(tái)的URL并組織好對(duì)應(yīng)的參數(shù),以HTTP GET的方式進(jìn)行調(diào)用,用戶頁(yè)面授權(quán)接口(zhima.auth.info.authorize)就是屬于頁(yè)面跳轉(zhuǎn)類接口,用戶在頁(yè)面上完成相應(yīng)的操作后,瀏覽器最后跳轉(zhuǎn)到商戶提供的callback URL,并帶上業(yè)務(wù)的返回結(jié)果在callback頁(yè)面的URL中,從而商戶可以在后臺(tái)從callback URL的請(qǐng)求中把業(yè)務(wù)返回結(jié)果拿到。
每個(gè)通過芝麻信用開放平臺(tái)輸出的芝麻信用產(chǎn)品,都會(huì)對(duì)應(yīng)于一個(gè)注冊(cè)在開放平臺(tái)中的接口(API),這些接口中會(huì)定義業(yè)務(wù)參數(shù)的列表,系統(tǒng)參數(shù)列表,返回值字段列表,以及錯(cuò)誤碼列表。每個(gè)接口會(huì)有一個(gè)對(duì)應(yīng)的接口文檔,里面會(huì)對(duì)系統(tǒng)參數(shù)、業(yè)務(wù)參數(shù)、返回值和錯(cuò)誤碼都有詳細(xì)的描述。
上面的介紹大家大致看下就好,也許你會(huì)很迷糊,那么我還是一步一步來說吧。首先我們要明白芝麻信用是怎么跟我們進(jìn)行交互的,那既然牽扯到接口的交互,那么肯定我們想到,需要一個(gè)地址去進(jìn)行交互,那么這個(gè)地址又是什么呢?這個(gè)地址就是:https://zmopenapi.zmxy.com.cn/openapi.do , 我們可以把它看成是一個(gè)入口,所有和芝麻進(jìn)行交互的一個(gè)入口,在入口的地方有很多的警衛(wèi)員,我們需要出示工牌(憑證)才能進(jìn)入辦公(執(zhí)行方法),如果我們的憑證(比如APPID,私鑰)等錯(cuò)誤的話,那么我們就不被擁有準(zhǔn)入權(quán)限。下面一張表格更加詳細(xì)的介紹了芝麻的一些準(zhǔn)入憑證等。
|
參數(shù)名 |
類型 |
是否必須 |
是否芝麻分配 |
示例值 |
備注 |
|
app_id |
String |
是 |
是 |
1000033 |
商戶應(yīng)用ID |
|
charset |
String |
是 |
否 |
UTF-8 |
加密加簽時(shí)使用的charset |
|
method |
String |
是 |
是 |
zhima.auth.info.authorize |
要調(diào)用的接口名 |
|
version |
String |
是 |
是 |
1.0 |
接口版本,目前只支持1.0 |
|
platform |
String |
否 |
是 |
zmop |
來源平臺(tái),默認(rèn)為zmop |
|
params |
String |
是 |
否 |
abc |
RSA加密后的業(yè)務(wù)參數(shù) |
|
sign |
String |
是 |
否 |
bcd |
對(duì)params參數(shù)加密前的簽名,算法為SHA1WithRSA |
對(duì)于上面的表格,我只介紹幾個(gè)詳細(xì)點(diǎn):
APPID即應(yīng)用ID,這個(gè)是芝麻給我們的應(yīng)用單獨(dú)分配的APPID,它其實(shí)是和Sign結(jié)合起來使用的,這說得有點(diǎn)迷糊,因?yàn)閺纳蠄D來說,Sign是客戶端生成的,所以我們首先需要了解一下Sign(簽名)的生成機(jī)制,其實(shí)也就是說,一個(gè)APPID,一次請(qǐng)求,會(huì)有一個(gè)獨(dú)一無二的簽名對(duì)應(yīng)起來,簽名就好像我開始說的準(zhǔn)入憑證,其實(shí)更形象的比喻就是一把鑰匙。
method后面會(huì)提到更多,其實(shí)當(dāng)你進(jìn)入“辦公場(chǎng)所”以后,你會(huì)發(fā)現(xiàn)其實(shí)不止一個(gè)部門,如果你想和某一個(gè)部門的人交流或者進(jìn)入某個(gè)部門(當(dāng)然現(xiàn)實(shí)中不存在或者很少有這種情況),你就需要一個(gè)method(方法),當(dāng)然更確切的比喻就是,如果你的面前有很多的保險(xiǎn)柜,不同部門的保險(xiǎn)柜需要你輸入不同的密碼,而在輸入密碼以前你會(huì)選擇是要對(duì)哪個(gè)保險(xiǎn)柜進(jìn)行操作,這個(gè)時(shí)候“方法”就是一個(gè)不可替代的前置條件了。
params,簡(jiǎn)單理解,就是你的Action對(duì)應(yīng)的 get請(qǐng)求的參數(shù)。
關(guān)于公鑰私鑰的介紹,請(qǐng)移步這篇文章。
不太理解的地方:數(shù)據(jù)反饋文檔。
關(guān)于param加密驗(yàn)簽,這里有相對(duì)應(yīng)的文檔。不過我覺得還是介紹一下比較好,其實(shí)主要是介紹了Sign的形成的方法,他們經(jīng)歷了如下過程,下面是官方的解釋,簡(jiǎn)單點(diǎn)概括,就是客戶端加密,然后傳到服務(wù)端,然后服務(wù)端解密,給出正確的數(shù)據(jù),然后再加密返回給客戶端,客戶端再進(jìn)行解密后拿到正確的數(shù)據(jù),具體的過程可以參考文檔。
1)商戶端發(fā)起請(qǐng)求到芝麻信用時(shí):
商戶使用芝麻信用的RSA公鑰對(duì)業(yè)務(wù)參數(shù)進(jìn)行RSA加密,使用商戶自己的RSA私鑰對(duì)業(yè)務(wù)參數(shù)進(jìn)行簽名;
芝麻信用使用芝麻信用的RSA私鑰進(jìn)行業(yè)務(wù)參數(shù)的解密,使用商戶的RSA公鑰進(jìn)行驗(yàn)簽。
2)芝麻信用返回調(diào)用結(jié)果給商戶時(shí):
芝麻信用使用商戶的RSA公鑰對(duì)業(yè)務(wù)返回結(jié)果進(jìn)行RSA加密,使用芝麻信用自己的RSA私鑰對(duì)業(yè)務(wù)返回結(jié)果進(jìn)行簽名;
商戶使用商戶自己的RSA私鑰對(duì)業(yè)務(wù)返回結(jié)果進(jìn)行解密,使用芝麻的RSA公鑰對(duì)業(yè)務(wù)返回結(jié)果進(jìn)行驗(yàn)簽
這里需要注意3個(gè)參數(shù),具體參考文檔:
| 序號(hào) | 參數(shù)名稱 | 用途 | 示例 |
| 1 | open_id | 芝麻用戶在商戶端的身份標(biāo)識(shí),商戶維度唯一且終生保持不變; 芝麻用戶在商戶端完成授權(quán)后生成。 |
268808719417710052884472095 |
| 2 | product_code | 產(chǎn)品碼,標(biāo)記商戶接入的具體產(chǎn)品; 直接使用每個(gè)接口入?yún)⒅惺纠导纯伞?/td> | w1010100100000000001 |
| 3 | transaction_id | 商戶請(qǐng)求的唯一標(biāo)志,長(zhǎng)度64位以內(nèi)字符串,僅限字母數(shù)字下劃線組合。 該標(biāo)識(shí)作為業(yè)務(wù)調(diào)用的唯一標(biāo)識(shí),商戶要保證其業(yè)務(wù)唯一性,使用相同transaction_id的查詢,芝麻在一段時(shí)間內(nèi)(一般為1天)返回首次查詢結(jié)果,超過有效期的查詢即為無效并返回異常,有效期內(nèi)的重復(fù)查詢不重新計(jì)費(fèi)。 |
20151127233347987676212309253,或直接采用UUID |
尤其是transaction_id,為什么說Transation_id非常的重要呢,我們知道,芝麻不是慈善機(jī)構(gòu),你每調(diào)用它一次,肯定是要收取費(fèi)用的,而這個(gè)Transaction_id其實(shí)是當(dāng)天有效的,所以我們可以在緩存中保存這個(gè)id,如果一天內(nèi)有多次調(diào)用,那么用這一個(gè)就夠了,否則會(huì)造成多余的RMB浪費(fèi)。
下面我會(huì)講到2個(gè)接口,一個(gè)是獲得授權(quán)(openid),另外一個(gè)是芝麻信用分的。或者授權(quán)(openid)的接口請(qǐng)看這里。關(guān)于詳細(xì)的介紹文檔里面都已經(jīng)說得非常清楚了,我使用的是姓名+身份證的方式進(jìn)行認(rèn)證,方式是H5,具體的示例代碼如下,參數(shù)請(qǐng)根據(jù)自己的情況自行調(diào)整,服務(wù)端SDK可以根據(jù)自己的語(yǔ)言選擇合適的,請(qǐng)看這里。
import com.antgroup.zmxy.openplatform.api.DefaultZhimaClient;
import com.antgroup.zmxy.openplatform.api.FileItem;
import com.antgroup.zmxy.openplatform.api.ZhimaApiException;
import com.antgroup.zmxy.openplatform.api.request.ZhimaAuthInfoAuthorizeRequest;
import com.antgroup.zmxy.openplatform.api.response.ZhimaAuthInfoAuthorizeResponse;
public class TestZhimaAuthInfoAuthorize {
//芝麻開放平臺(tái)地址
private String gatewayUrl = "https://zmopenapi.zmxy.com.cn/openapi.do";
//商戶應(yīng)用 Id
private String appId = "***";
//商戶 RSA 私鑰
private String privateKey = "***";
//芝麻 RSA 公鑰
private String zhimaPublicKey = "***";
public void testZhimaAuthInfoAuthorize() {
ZhimaAuthInfoAuthorizeRequest req = new ZhimaAuthInfoAuthorizeRequest();
req.setChannel("apppc");
req.setPlatform("zmop");
req.setIdentityType("1");// 必要參數(shù)
req.setIdentityParam("{"name":"張三","certType":"IDENTITY_CARD","certNo":"330100xxxxxxxxxxxx"}");// 必要參數(shù)
req.setBizParams("{"auth_code":"M_H5","channelType":"app","state":"商戶自定義"}");//
DefaultZhimaClient client = new DefaultZhimaClient(gatewayUrl, appId, privateKey,
zhimaPublicKey);
try {
String url = client.generatePageRedirectInvokeUrl(request);
System.out.println(url);
} catch (ZhimaApiException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
TestZhimaAuthInfoAuthorize result = new TestZhimaAuthInfoAuthorize();
result.testZhimaAuthInfoAuthorize();
}
}
頁(yè)面授權(quán)接口是頁(yè)面跳轉(zhuǎn)類接口,如果成功的話,會(huì)返回相對(duì)應(yīng)的URL,不過我有一個(gè)疑問,這個(gè)跳轉(zhuǎn)的URL是哪里指定的呢,個(gè)人覺得應(yīng)該是芝麻里面設(shè)置的,如下圖所示。
還需要注意一下,如果是授權(quán)接口的話,商戶是有權(quán)關(guān)閉授權(quán)的,比如你的公司接入了芝麻,你的客戶公司有一天關(guān)閉了芝麻的授權(quán),那么你就獲取不到了,就算有OPENID!如果商戶關(guān)閉了授權(quán),就算你拿到了OPENID,也會(huì)獲取不成功,可以這么做:把OPENID存入數(shù)據(jù)庫(kù),如果第一次調(diào)用,就用下面第二種方式,如果第二次調(diào)用,就用第一種方式,因?yàn)樗鼤?huì)返回是否授權(quán)成功,這樣就不用每次對(duì)用身份證和姓名去查了,因?yàn)镺PENID一旦生成,就是唯一且不變的。
| 身份標(biāo)識(shí)類型
1:按照OPENId進(jìn)行授權(quán) 2:按照身份證+姓名進(jìn)行授權(quán) |
最后需要注意biz_no這個(gè)字段,每一個(gè)獲取數(shù)據(jù)的接口都會(huì)有一個(gè)BIZ_NO的返回字段,官方的解釋是對(duì)賬用的,因?yàn)槊恳淮握?qǐng)求芝麻信用,其實(shí)都是收費(fèi)的,所以到后期進(jìn)行結(jié)算的時(shí)候,需要這些憑證,所以大家還是小心為好,最后附上一張我自己畫的流程圖吧。
我會(huì)記錄對(duì)于接口的一些進(jìn)展:
Update 1:
已知的問題(未解決):
如果用戶關(guān)閉了對(duì)芝麻信用的商戶授權(quán),因?yàn)樯虘?Server)并不知道用戶是否關(guān)閉了芝麻信
用的授權(quán),是否每一次都要去調(diào)用授權(quán)查詢接口(芝麻端)。使用身份證號(hào)姓名或者OPENID計(jì)
費(fèi)的費(fèi)用是否不同(待確認(rèn))?
對(duì)于輸入的參數(shù),有可能出現(xiàn)不同的接口錯(cuò)誤碼,那么對(duì)于這些不同的接口錯(cuò)誤碼,該怎樣
做不同的處理,還是統(tǒng)一跳出邏輯?
頁(yè)面跳轉(zhuǎn)類接口,sign的作用是什么?
什么時(shí)候會(huì)觸發(fā)不同的芝麻接口,用戶主動(dòng)觸發(fā)?還是服務(wù)端觸發(fā)?
我需要提供幾個(gè)接口出來?
計(jì)費(fèi)怎么算?
芝麻那邊有測(cè)試環(huán)境嗎,具體調(diào)用次數(shù)有限制嗎。
哪些步驟需要和其他人聯(lián)調(diào)
回調(diào)頁(yè)面是回調(diào)到哪里,回調(diào)頁(yè)面具體有什么用,如果以后有新的渠道接入進(jìn)來(比如SDK,H5,PC等),該怎么弄
才能保證擴(kuò)展性。
芝麻那邊有對(duì)接人員嗎?還是只是我們這邊單獨(dú)調(diào)用他們那邊的接口呢?
總結(jié)
以上是生活随笔為你收集整理的芝麻信用商家接入指南的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: GenericUDTF使用流程记载(转载
- 下一篇: Linux MMC介绍