前言
??前段時間公司的 APP 加了一些新需求,其中我負責的錢包模塊多增加了支付寶綁定和支付寶支付的功能。所以研究了一番,在此做個記錄,如果有說的不對的地方,歡迎大佬指出并糾正。
支付寶授權
??支付寶授權其實就是使用支付寶第三方登錄,需要用戶同意授權,使用支付寶登錄你的 APP,這樣你的 APP 就可以通過支付寶 SDK 提供的接口去獲取對應的支付寶信息。例如:你的支付寶賬戶的唯一標示等。
-
支付寶授權流程圖
授權流程 支付寶授權流程
- APP 向自己后臺發起授權請求,后臺給 APP 返回授權碼,其實就是一個帶著私鑰的字符串。
- APP 拿著后臺返回的授權碼去向支付寶發起授權請求。
- 支付寶返回給 APP 當次授權的授權碼
app_auth_code
和開發者的app_id
。 - 拿到支付寶返回的當前授權的授權碼
app_auth_code
發送給自己的后臺去換取app_auth_token
。 - 用換取的
app_auth_token
去調用支付寶提供的alipay.open.auth.token.app
接口去獲取授權用戶的userId
。
- 支付寶授權代碼示例
??首先你需要去下載支付寶提供的官方 Demo,然后把官方 Demo 里的APAuthInfo
拷貝到你的項目里。
#import <Foundation/Foundation.h>
@interface APAuthInfo : NSObject
/*********************************授權必傳參數*********************************/
//服務接口名稱,常量com.alipay.account.auth。
@property (nonatomic, copy) NSString *apiname;
//調用方app標識 ,mc代表外部商戶。
@property (nonatomic, copy) NSString *appName;
//調用業務類型,openservice代表開放基礎服務
@property (nonatomic, copy) NSString *bizType;
//產品碼,目前只有WAP_FAST_LOGIN
@property (nonatomic, copy) NSString *productID;
//簽約平臺內的appid
@property (nonatomic, copy) NSString *appID;
//商戶簽約id
@property (nonatomic, copy) NSString *pid;
//授權類型,AUTHACCOUNT:授權;LOGIN:登錄
@property (nonatomic, copy) NSString *authType;
//商戶請求id需要為unique,回調使用
@property (nonatomic, copy) NSString *targetID;
/*********************************授權可選參數*********************************/
//oauth里的授權范圍,PD配置,默認為kuaijie
@property (nonatomic, copy) NSString *scope;
//固定值,alipay.open.auth.sdk.code.get
@property (nonatomic, copy) NSString *method;
@end
??其中APAuthInfo
中的appID
、pid
、targetID
這三個參數是需要我們自己去賦值的。appID
就是你申請的 APP 在支付寶平臺的唯一標識,pid
是你申請的 APP 在支付寶平臺對應的商戶號,targetID
是保證每次請求的時候它的值是唯一的,所以一般賦值為當前時間的時間戳。
APAuthInfo *authInfo = [APAuthInfo new];
authInfo.pid = AliPayPid;
authInfo.appID = AliPayID;
authInfo.targetID = [NSString stringWithFormat:@"%ld", (long)[[NSDate date] timeIntervalSince1970]];
// 將授權信息拼接成字符串
NSString *authInfoStr = [authInfo description];
NSLog(@"authInfoStr = %@",authInfoStr);
??然后向自己后臺去請求獲取私鑰和私鑰加密方式,拿到私鑰以及私鑰加密方式只后拼接成指定格式的字符串,拿這個字符串去發起支付寶授權。
authInfoStr = [NSString stringWithFormat:@"%@&sign=%@&sign_type=%@", authInfoStr, sign, @"RSA2"];
[[AlipaySDK defaultService] auth_V2WithInfo:authInfoStr fromScheme:appScheme callback:^(NSDictionary *resultDic) {
NSLog(@"resultDic = %@", resultDic);
// 解析 auth code
NSString *result = resultDic[@"result"];
[self handlderAliPayAuthInfo:result];
}];
??最后,拿到支付寶授權接口的返回值,取result
字段所對應的字符串,然后截取出我們需要的auth_code
和alipay_open_id
。然后再把這兩個值傳給后端,由后端去調取支付寶接口去獲取用戶信息。
- (void)handlderAliPayAuthInfo:(NSString *)result {
NSString *authCode = nil;
NSString *openId = nil;
if (result.length > 0) {
NSArray *resultArr = [result componentsSeparatedByString:@"&"];
for (NSString *subResult in resultArr) {
if (subResult.length > 10 && [subResult hasPrefix:@"auth_code="]) {
authCode = [subResult substringFromIndex:10];
}
if (subResult.length > 32 && [subResult hasPrefix:@"alipay_open_id="]) {
openId = [subResult substringFromIndex:15];
}
if (openId.length != 0 && authCode.length != 0) {
break;
}
}
}
NSLog(@"授權結果 authCode = %@, openId = %@", authCode?:@"", openId?:@"");
}
注意
- 應用授權的
app_auth_code
是唯一的;app_auth_code
使用一次后就會失效,一天(從生成app_auth_code
開始的24小時)未被使用就會自動過期;app_auth_token
有效期為365天,刷新后重新計時。 - 支付寶的私鑰必須存放在后端,不能存放在前段。因為在支付寶平臺申請 APP 的時候就會生產一對私鑰和公鑰,只有當你穿的私鑰和支付寶平臺存放的公鑰相配對成功之后,授權請求才會成功。所以,如果把私鑰存放在前段會存在很大的危險漏洞,因此只能把私鑰存放在后端。