整個支付邏輯分為兩個部分
1.通過跳轉(zhuǎn)支付寶APP完成支付
新版需要appID 和 privateKey
2.通過手機(jī)網(wǎng)頁完成支付
和舊版一樣需要pid appID 和 privateKey
對訂單模型order的總結(jié)
訂單模型中分為兩個部分
商品模型
@interface BizContent : NSObject
// NOTE: (非必填項)商品描述
@property (nonatomic, copy) NSString *body;
// NOTE: 商品的標(biāo)題/交易標(biāo)題/訂單標(biāo)題/訂單關(guān)鍵字等。
@property (nonatomic, copy) NSString *subject;
// NOTE: 商戶網(wǎng)站唯一訂單號
@property (nonatomic, copy) NSString *out_trade_no;
// NOTE: 該筆訂單允許的最晚付款時間,逾期將關(guān)閉交易。
// 取值范圍:1m~15d m-分鐘,h-小時,d-天,1c-當(dāng)天(1c-當(dāng)天的情況下,無論交易何時創(chuàng)建,都在0點(diǎn)關(guān)閉)
// 該參數(shù)數(shù)值不接受小數(shù)點(diǎn), 如1.5h,可轉(zhuǎn)換為90m。
@property (nonatomic, copy) NSString *timeout_express;
// NOTE: 訂單總金額,單位為元,精確到小數(shù)點(diǎn)后兩位,取值范圍[0.01,100000000]
@property (nonatomic, copy) NSString *total_amount;
// NOTE: 收款支付寶用戶ID。 如果該值為空,則默認(rèn)為商戶簽約賬號對應(yīng)的支付寶用戶ID (如 2088102147948060)
@property (nonatomic, copy) NSString *seller_id;
// NOTE: 銷售產(chǎn)品碼,商家和支付寶簽約的產(chǎn)品碼 (如 QUICK_MSECURITY_PAY)
@property (nonatomic, copy) NSString *product_code;
@end
訂單模型
@interface Order : NSObject
// NOTE: 支付寶分配給開發(fā)者的應(yīng)用ID(如2014072300007148)
@property (nonatomic, copy) NSString *app_id;
// NOTE: 支付接口名稱
@property (nonatomic, copy) NSString *method;
// NOTE: (非必填項)僅支持JSON
@property (nonatomic, copy) NSString *format;
// NOTE: (非必填項)HTTP/HTTPS開頭字符串
@property (nonatomic, copy) NSString *return_url;
// NOTE: 參數(shù)編碼格式,如utf-8,gbk,gb2312等
@property (nonatomic, copy) NSString *charset;
// NOTE: 請求發(fā)送的時間,格式"yyyy-MM-dd HH:mm:ss"
@property (nonatomic, copy) NSString *timestamp;
// NOTE: 請求調(diào)用的接口版本,固定為:1.0
@property (nonatomic, copy) NSString *version;
// NOTE: (非必填項)支付寶服務(wù)器主動通知商戶服務(wù)器里指定的頁面http路徑
@property (nonatomic, copy) NSString *notify_url;
// NOTE: (非必填項)商戶授權(quán)令牌,通過該令牌來幫助商戶發(fā)起請求,完成業(yè)務(wù)(如201510BBaabdb44d8fd04607abf8d5931ec75D84)
@property (nonatomic, copy) NSString *app_auth_token;
// NOTE: 具體業(yè)務(wù)請求數(shù)據(jù)
@property (nonatomic, strong) BizContent *biz_content;
// NOTE: 簽名類型
@property (nonatomic, copy) NSString *sign_type;
/**
* 獲取訂單信息串
*
* @param bEncoded 訂單信息串中的各個value是否encode
* 非encode訂單信息串,用于生成簽名
* encode訂單信息串 + 簽名,用于最終的支付請求訂單信息串
*/
- (NSString *)orderInfoEncoded:(BOOL)bEncoded;
@end
快速完成支付功能步驟(通過跳轉(zhuǎn)支付寶APP方式)(步驟一和二在服務(wù)器完成)
步驟1:生成訂單信息. 調(diào)用order.m里的函數(shù)description將商品信息拼接成字符串作為待簽名字符串,如:
app_id=2015052600090779&biz_content={"timeout_express":"30m","seller_id":"","product_code":"QUICK_MSECURITY_PAY","total_amount":"0.02","subject":"1","body":"我是測試數(shù)據(jù)","out_trade_no":"ZQLM3O56MJD4SK3"}&charset=utf-8&method=alipay.trade.app.pay&sign_type=RSA×tamp=2016-07-28 20:36:11&version=1.0
步驟2:對訂單信息簽名. 使用類CreateRSADataSigner,調(diào)用signString簽名函數(shù)做簽名,如:
// 獲取私鑰并將商戶信息簽名,外部商戶可以根據(jù)情況存放私鑰和簽名,只需要遵循RSA簽名規(guī)范,并將簽名字符串base64編碼和UrlEncode
id<DataSigner> signer = CreateRSADataSigner(privateKey);
NSString *signedString = [signer signString:authInfoStr];
步驟3:把簽名結(jié)果賦值給參數(shù)sign,并把sign加入之前的待簽名數(shù)組中,此時得到的便是要請求給支付寶的全部數(shù)據(jù)。
app_id=2015052600090779&biz_content={"timeout_express":"30m","seller_id":"","product_code":"QUICK_MSECURITY_PAY","total_amount":"0.02","subject":"1","body":"我是測試數(shù)據(jù)","out_trade_no":"ZQLM3O56MJD4SK3"}&charset=utf-8&method=alipay.trade.app.pay&sign_type=RSA×tamp=2016-07-28 20:36:11&version=1.0&sign=*********
步驟4:調(diào)用(AlipaySDK *)defaultService類下面的支付接口函數(shù),喚起支付寶支付頁面。
(void)payOrder:(NSString *)orderStr
fromScheme:(NSString *)schemeStr
callback:(CompletionBlock)completionBlock
appScheme為app在info.plist注冊的scheme。
步驟5:當(dāng)這筆交易被買家支付成功后支付寶收銀臺上顯示該筆交易成功,并提示用戶“返回”。此時在APAppDelegate.m的 - (BOOL)application:(UIApplication )application openURL:(NSURL )url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation 中調(diào)用獲取返回數(shù)據(jù)的代碼【iOS9.0以上(包括iOS9.0)需要在 - (BOOL)application:(UIApplication *)app openURL:(NSURL )url options:(NSDictionary<NSString, id> *)options 中執(zhí)行 】:
[[AlipaySDK defaultService]
processOrderWithPaymentResult:url
standbyCallback:^(NSDictionary *resultDic) {
NSLog(@"result = %@",resultDic);//返回的支付結(jié)果
//【由于在跳轉(zhuǎn)支付寶客戶端支付的過程中,商戶app在后臺很可能被系統(tǒng)kill了,所以pay接口的callback就會失效,請商戶對standbyCallback返回的回調(diào)結(jié)果進(jìn)行處理,就是在這個方法里面處理跟callback一樣的邏輯】
}];
快速完成支付功能步驟(通過網(wǎng)頁完成方式)
步驟1:生成APAuthV2Info對象, 將授權(quán)信息拼接成字符串作為待簽名字符串,如:
//生成 auth info 對象
APAuthV2Info *authInfo = [APAuthV2Info new];
authInfo.pid = pid;
authInfo.appID = appID;
//auth type
NSString *authType = [[NSUserDefaults standardUserDefaults] objectForKey:@"authType"];
if (authType) {
authInfo.authType = authType;
}
//應(yīng)用注冊scheme,在AlixPayDemo-Info.plist定義URL types
NSString *appScheme = @"alisdkdemo";
// 將授權(quán)信息拼接成字符串
NSString *authInfoStr = [authInfo description];
NSLog(@"authInfoStr = %@",authInfoStr);
步驟2:使用類CreateRSADataSigner,調(diào)用signString簽名函數(shù)做簽名,如:
// 獲取私鑰并將商戶信息簽名,外部商戶可以根據(jù)情況存放私鑰和簽名,只需要遵循RSA簽名規(guī)范,并將簽名字符串base64編碼和UrlEncode
id<DataSigner> signer = CreateRSADataSigner(privateKey);
NSString *signedString = [signer signString:authInfoStr];
步驟3:把簽名結(jié)果賦值給參數(shù)sign,并把sign加入之前的待簽名數(shù)組中,此時得到的便是要請求給支付寶的全部數(shù)據(jù)。
app_id=2015052600090779&biz_content={"timeout_express":"30m","seller_id":"","product_code":"QUICK_MSECURITY_PAY","total_amount":"0.02","subject":"1","body":"我是測試數(shù)據(jù)","out_trade_no":"ZQLM3O56MJD4SK3"}&charset=utf-8&method=alipay.trade.app.pay&sign_type=RSA×tamp=2016-07-28 20:36:11&version=1.0&sign=*********
步驟4:調(diào)用(AlipaySDK *)defaultService類下面的支付接口函數(shù),喚起支付寶支付頁面。
// 將簽名成功字符串格式化為訂單字符串,請嚴(yán)格按照該格式
authInfoStr = [NSString stringWithFormat:@"%@&sign=%@&sign_type=%@", authInfoStr, signedString, @"RSA"];
[[AlipaySDK defaultService] auth_V2WithInfo:authInfoStr
fromScheme:appScheme
callback:^(NSDictionary *resultDic) {
NSLog(@"result = %@",resultDic);
// 解析 auth code
NSString *result = resultDic[@"result"];
NSString *authCode = 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];
break;
}
}
}
NSLog(@"授權(quán)結(jié)果 authCode = %@", authCode?:@"");
}];
步驟5:當(dāng)這筆交易被買家支付成功后支付寶收銀臺上顯示該筆交易成功,并提示用戶“返回”。此時在APAppDelegate.m的 - (BOOL)application:(UIApplication )application openURL:(NSURL )url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation 中調(diào)用獲取返回數(shù)據(jù)的代碼【iOS9.0以上(包括iOS9.0)需要在 - (BOOL)application:(UIApplication *)app openURL:(NSURL )url options:(NSDictionary<NSString, id> *)options 中執(zhí)行 】:
[[AlipaySDK defaultService]
processOrderWithPaymentResult:url
standbyCallback:^(NSDictionary *resultDic) {
NSLog(@"result = %@",resultDic);//返回的支付結(jié)果
//【由于在跳轉(zhuǎn)支付寶客戶端支付的過程中,商戶app在后臺很可能被系統(tǒng)kill了,所以pay接口的callback就會失效,請商戶對standbyCallback返回的回調(diào)結(jié)果進(jìn)行處理,就是在這個方法里面處理跟callback一樣的邏輯】
}];
App支付iOS調(diào)用說明
快捷訂單支付iOS
處理客戶端返回url
回調(diào)接口
接口名稱:AlipaySDK
接口描述:提供支付功能。
Alipay接口主要為商戶提供訂單支付功能。接口所提供的方法,如下表所示:
方法名稱 方法描述
+(Alipay *)defaultService; 獲取服務(wù)實例。
-(void)payOrder:(NSString *)orderStr fromScheme:(NSString *)schemeStr callback:(CompletionBlock)completionBlock; 支付并通過回調(diào)返回結(jié)果。
-(void)processOrderWithPaymentResult:(NSURL*)resultUrl standbyCallback:(CompletionBlock)completionBlock; 處理支付寶客戶端返回的url(在app被殺模式下,通過這個方法獲取支付結(jié)果)。
快捷訂單支付iOS
方法名稱:pay方法
方法原型:(void)payOrder:(NSString *)orderStr fromScheme:(NSString *)schemeStr callback:(CompletionBlock)completionBlock;
方法功能:提供給商戶快捷訂單支付功能。
參數(shù)名稱 參數(shù)描述
NSString* scheme 商戶程序注冊的URL protocol,供支付完成后回調(diào)商戶程序使用。
(CompletionBlock)completionBlock 快捷支付開發(fā)包回調(diào)函數(shù),返回免登、支付結(jié)果。本地未安裝支付寶客戶端,或未成功調(diào)用支付寶客戶端進(jìn)行支付的情況下(走H5收銀臺),會通過該completionBlock返回支付結(jié)果。相應(yīng)的結(jié)果參考"客戶端同步返回"。
NSString* orderString app支付請求參數(shù)字符串,主要包含商戶的訂單信息,key=value形式,以&連接。
orderStr示例如下,參數(shù)說明見"請求參數(shù)說明":
app_id=2015052600090779&biz_content=%7B%22timeout_express%22%3A%2230m%22%2C%22seller_id%22%3A%22%22%2C%22product_code%22%3A%22QUICK_MSECURITY_PAY%22%2C%22total_amount%22%3A%220.02%22%2C%22subject%22%3A%221%22%2C%22body%22%3A%22%E6%88%91%E6%98%AF%E6%B5%8B%E8%AF%95%E6%95%B0%E6%8D%AE%22%2C%22out_trade_no%22%3A%22314VYGIAGG7ZOYY%22%7D&charset=utf-8&method=alipay.trade.app.pay&sign_type=RSA×tamp=2016-08-15%2012%3A12%3A15&version=1.0&sign=MsbylYkCzlfYLy9PeRwUUIg9nZPeN9SfXPNavUCroGKR5Kqvx0nEnd3eRmKxJuthNUx4ERCXe552EV9PfwexqW%2B1wbKOdYtDIb4%2B7PL3Pc94RZL0zKaWcaY3tSL89%2FuAVUsQuFqEJdhIukuKygrXucvejOUgTCfoUdwTi7z%2BZzQ%3D
處理客戶端返回url
方法名稱:處理客戶端方法
方法原型:-(void)processOrderWithPaymentResult:(NSURL*)resultUrl standbyCallback:(CompletionBlock)completionBlock;
方法功能:設(shè)備已安裝支付寶客戶端情況下,處理支付寶客戶端返回的url(在app被殺模式下,通過這個方法獲取支付結(jié)果)。
注意:該方法必須實現(xiàn),否則將會導(dǎo)致在安裝手機(jī)支付寶的情況下,支付結(jié)果無法正常同步返回。
參數(shù)名稱 參數(shù)描述
NSURL *resultUrl 支付寶客戶端回傳的url
CompletionBlock completionBlock 本地安裝了支付寶客戶端,且成功調(diào)用支付寶客戶端進(jìn)行支付的情況下,會通過該completionBlock返回支付結(jié)果
備注:請在APPDelegate的 - (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation 中調(diào)用該方法,iOS9.0以上(包括iOS9.0)請在 - (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<NSString*, id> *)options 中調(diào)用該方法,具體可參見Demo。
回調(diào)接口
在支付過程結(jié)束后,會通過callbackBlock同步返回支付結(jié)果(callbackBlock是調(diào)用支付同步的回調(diào))。支付結(jié)果中參數(shù)的提取,必須通過CompletionBlock獲取,禁止開發(fā)者私自解析支付結(jié)果返回的URL,參數(shù)說明見"客戶端同步返回"。
其他接入方式
概述
對比
如果您已經(jīng)接入了手機(jī)網(wǎng)站支付,除了“集成流程詳解”中介紹的接入方式,支付寶推薦另一種更為便利的SDK接入方式——手機(jī)網(wǎng)站支付轉(zhuǎn)為Native支付。
概述
如果您已經(jīng)接入支付寶手機(jī)網(wǎng)站支付,可以通過接入我們的SDK將手機(jī)網(wǎng)站支付轉(zhuǎn)為Native支付。接入過程極其簡單,只需攔截手機(jī)網(wǎng)站支付的url,將該url轉(zhuǎn)交給SDK進(jìn)行處理;無需接入者解析參數(shù)字段,接入者的服務(wù)端也無需改造。
為什么要將手機(jī)網(wǎng)站支付轉(zhuǎn)為Native支付? Native支付的用戶體驗和支付成功率均優(yōu)于手機(jī)網(wǎng)站支付。
對比
下面以淘寶為例對比手機(jī)網(wǎng)站支付和手機(jī)網(wǎng)站轉(zhuǎn)Native支付的流程。
手機(jī)網(wǎng)站支付流程
步驟一: 在手機(jī)端瀏覽器中訪問淘寶主頁www.taobao.com
步驟二: 挑選商品并進(jìn)行付款
步驟三: 點(diǎn)擊“立即支付”進(jìn)入付款詳情頁面(H5頁面)
手機(jī)網(wǎng)站轉(zhuǎn)Native支付流程
下載Demo,并將Demo App安裝到手機(jī)上即可體驗該流程,請確保手機(jī)上安裝了支付寶App。
步驟一: 運(yùn)行Demo,并在Demo中打開淘寶主頁www.taobao.com
iOS: 點(diǎn)擊URLPay->openUrl,輸入www.taobao.com
Android: 點(diǎn)擊網(wǎng)頁支付轉(zhuǎn)native
步驟二: 挑選商品并進(jìn)行付款
iOS截圖
Android截圖
對比總結(jié)
主要區(qū)別是:如果用戶手機(jī)安裝了支付寶App,手機(jī)網(wǎng)站轉(zhuǎn)Native支付方式會跳轉(zhuǎn)到支付寶App中進(jìn)行訂單支付,用戶體驗和支付成功率均優(yōu)于手機(jī)網(wǎng)站支付方式。除此之外,還能使用手機(jī)網(wǎng)站支付沒有提供的功能,例如:指紋支付、手環(huán)、手表支付、免密支付等。
如果用戶手機(jī)沒有安裝支付寶App怎么辦? 如果用戶手機(jī)沒有安裝支付寶App,將在SDK提供的WebView中打開H5頁面進(jìn)行支付。即便如此,由于SDK與服務(wù)端的交互攜帶賬號信息,仍比不攜帶任何賬號信息的普通手機(jī)網(wǎng)站支付體驗更好。
如何實現(xiàn)手機(jī)網(wǎng)站轉(zhuǎn)Native支付
要實現(xiàn)上述功能需接入我們提供的SDK。
接入過程十分簡單,可以以上述Demo為參考,該Demo程序只有一個功能:創(chuàng)建一個WebView,在WebView中攔截每個URL,然后調(diào)用SDK提供的接口檢查該URL是否是有效的支付寶訂單支付URL,如果是則將該URL傳給SDK提供的支付接口進(jìn)行支付。
支付寶請求參數(shù)說明
接口功能:外部商戶App喚起快捷SDK創(chuàng)建訂單并支付。
請求參數(shù)是商戶在與支付寶進(jìn)行數(shù)據(jù)交互時,提供給支付寶的請求數(shù)據(jù),以便支付寶根據(jù)這些數(shù)據(jù)進(jìn)一步處理。
公共參數(shù) -- order
參數(shù) 類型 是否必填 最大長度 描述 示例值
app_id String 是 32 支付寶分配給開發(fā)者的應(yīng)用ID 2014072300007148
method String 是 128 接口名稱 alipay.trade.app.pay
format String 否 40 僅支持JSON JSON
charset String 是 10 請求使用的編碼格式,如utf-8,gbk,gb2312等 utf-8
sign_type String 是 10 商戶生成簽名字符串所使用的簽名算法類型,目前支持RSA RSA
sign String 是 256 商戶請求參數(shù)的簽名串,詳見簽名 詳見示例
timestamp String 是 19 發(fā)送請求的時間,格式"yyyy-MM-dd HH:mm:ss" 2014-07-24 03:07:50
version String 是 3 調(diào)用的接口版本,固定為:1.0 1.0
notify_url String 是 256 支付寶服務(wù)器主動通知商戶服務(wù)器里指定的頁面http/https路徑。建議商戶使用https https://api.xx.com/receive_notify.htm
biz_content String 是 - 業(yè)務(wù)請求參數(shù)的集合,最大長度不限,除公共參數(shù)外所有請求參數(shù)都必須放在這個參數(shù)中傳遞,具體參照各產(chǎn)品快速接入文檔
業(yè)務(wù)參數(shù) -- biz_content
參數(shù) 類型 是否必填 最大長度 描述 示例值
body String 否 128 對一筆交易的具體描述信息。如果是多種商品,請將商品描述字符串累加傳給body。 Iphone6 16G
subject String 是 256 商品的標(biāo)題/交易標(biāo)題/訂單標(biāo)題/訂單關(guān)鍵字等。 大樂透
out_trade_no String 是 64 商戶網(wǎng)站唯一訂單號 70501111111S001111119
timeout_express String 否 6 該筆訂單允許的最晚付款時間,逾期將關(guān)閉交易。取值范圍:1m~15d。m-分鐘,h-小時,d-天,1c-當(dāng)天(1c-當(dāng)天的情況下,無論交易何時創(chuàng)建,都在0點(diǎn)關(guān)閉)。 該參數(shù)數(shù)值不接受小數(shù)點(diǎn), 如 1.5h,可轉(zhuǎn)換為 90m。 90m
total_amount String 是 9 訂單總金額,單位為元,精確到小數(shù)點(diǎn)后兩位,取值范圍[0.01,100000000] 9.00
seller_id String 否 16 收款支付寶用戶ID。 如果該值為空,則默認(rèn)為商戶簽約賬號對應(yīng)的支付寶用戶ID 2088102147948060
product_code String 是 64 銷售產(chǎn)品碼,商家和支付寶簽約的產(chǎn)品碼 QUICK_MSECURITY_PAY
請求示例
請求參數(shù)組裝分下列3步,以最后第三步獲取到的請求為準(zhǔn)
- 請求參數(shù)按照key=value&key=value方式拼接的未簽名原始字符串:
app_id=2015052600090779&biz_content={"timeout_express":"30m","seller_id":"","product_code":"QUICK_MSECURITY_PAY","total_amount":"0.01","subject":"1","body":"我是測試數(shù)據(jù)","out_trade_no":"IQJZSRC1YMQB5HU"}&charset=utf-8&format=json&method=alipay.trade.app.pay¬ify_url=http://domain.merchant.com/payment_notify&sign_type=RSA×tamp=2016-08-25 20:26:31&version=1.0
- 再對原始字符串進(jìn)行簽名,參考 簽名規(guī)則:
app_id=2015052600090779&biz_content={"timeout_express":"30m","seller_id":"","product_code":"QUICK_MSECURITY_PAY","total_amount":"0.01","subject":"1","body":"我是測試數(shù)據(jù)","out_trade_no":"IQJZSRC1YMQB5HU"}&charset=utf-8&format=json&method=alipay.trade.app.pay¬ify_url=http://domain.merchant.com/payment_notify&sign_type=RSA×tamp=2016-08-25 20:26:31&version=1.0&sign=cYmuUnKi5QdBsoZEAbMXVMmRWjsuUj+y48A2DvWAVVBuYkiBj13CFDHu2vZQvmOfkjE0YqCUQE04kqm9Xg3tIX8tPeIGIFtsIyp/M45w1ZsDOiduBbduGfRo1XRsvAyVAv2hCrBLLrDI5Vi7uZZ77Lo5J0PpUUWwyQGt0M4cj8g=
- 最后對請求字符串的所有一級value(biz_content作為一個value)進(jìn)行encode,編碼格式按請求串中的charset為準(zhǔn),沒傳charset按UTF-8處理,獲得最終的請求字符串:
app_id=2015052600090779&biz_content=%7B%22timeout_express%22%3A%2230m%22%2C%22seller_id%22%3A%22%22%2C%22product_code%22%3A%22QUICK_MSECURITY_PAY%22%2C%22total_amount%22%3A%220.01%22%2C%22subject%22%3A%221%22%2C%22body%22%3A%22%E6%88%91%E6%98%AF%E6%B5%8B%E8%AF%95%E6%95%B0%E6%8D%AE%22%2C%22out_trade_no%22%3A%22IQJZSRC1YMQB5HU%22%7D&charset=utf-8&format=json&method=alipay.trade.app.pay¬ify_url=http%3A%2F%2Fdomain.merchant.com%2Fpayment_notify&sign_type=RSA×tamp=2016-08-25%2020%3A26%3A31&version=1.0&sign=cYmuUnKi5QdBsoZEAbMXVMmRWjsuUj%2By48A2DvWAVVBuYkiBj13CFDHu2vZQvmOfkjE0YqCUQE04kqm9Xg3tIX8tPeIGIFtsIyp%2FM45w1ZsDOiduBbduGfRo1XRsvAyVAv2hCrBLLrDI5Vi7uZZ77Lo5J0PpUUWwyQGt0M4cj8g%3D
特殊說明(很重要)
- 商戶在請求參數(shù)中,自己附屬的一些額外參數(shù),不要和支付寶系統(tǒng)中約定的key(下表中 公共請求參數(shù)\請求參數(shù))重名,否則將可能導(dǎo)致未知的異常。
比如以下示例中app_id=2014072300007148******&version=1.0&biz_content的key是公共請求參數(shù),業(yè)務(wù)方自己的擴(kuò)展參數(shù)需要放在biz_content內(nèi)部,比如示例中tips屬性,很顯然下面total_amount屬性是商戶按照自己的業(yè)務(wù)屬性賦值的,但是由于total_amount也是支付寶關(guān)鍵key,支付寶將會認(rèn)為這個total_amount是支付寶業(yè)務(wù)的參數(shù)應(yīng)該是金額,這個最終將導(dǎo)致誤解析。下列請求串為了展示清晰,未進(jìn)行encode并且做了格式化處理,下同。
app_id=2014072300007148&charset=UTF-8&version=1.0×tamp=2016-07-01 08:08:08&method=alipay.trade.wap.pay¬ify_url=https://api.**.com/pay_receive_notify.html&sign_type=RSA&sign=ERITJKEIJKJHKKKKKKKHJEREEEEEEEEEEE&version=1.0&biz_content=
{
"body":"對一筆交易的具體描述信息。如果是多種商品,請將商品描述字符串累加傳給body。",
"subject":"大樂透",
"out_trade_no":"70501111111S001111119",
"timeout_express":"90m",
"total_amount":"一共花費(fèi)了10元",
"seller_id":"2088102147948060",
"auth_token":"appopenBb64d181d0146481ab6a762c00714cC27",
"product_code":"QUICK_MSECURITY_PAY",
"tips":"測試一筆支付"
}
- 商戶的請求參數(shù)中,所有的key(支付寶關(guān)鍵key或者商戶自己的key),其對應(yīng)的value中都不應(yīng)該出現(xiàn)支付寶關(guān)鍵key,否則該類交易將可能被支付寶攔截禁止支付。
比如以下的請求中"subject":"大樂透 這個辣條不錯 out_trade_no=123 total_fee=123.5",其value值中有支付寶關(guān)鍵key"out_trade_no"、"total_fee",這樣的業(yè)務(wù)請求參數(shù)支付寶將會攔截。
app_id=2014072300007148&charset=UTF-8&version=1.0×tamp=2016-07-01 08:08:08&method=alipay.trade.wap.pay¬ify_url=https://api.**.com/pay_receive_notify.htm&sign_type=RSA&sign=ERITJKEIJKJHKKKKKKKHJEREEEEEEEEEEE&version=1.0&biz_content=
{
"body":"對一筆交易的具體描述信息。如果是多種商品,請將商品描述字符串累加傳給body。",
"subject":"大樂透 這個辣條不錯 out_trade_no=123 total_fee=123.5",
"out_trade_no":"70501111111S001111119",
"timeout_express":"90m",
"total_amount":10.0,
"seller_id":"2088102147948060",
"auth_token":"appopenBb64d181d0146481ab6a762c00714cC27",
"product_code":"QUICK_MSECURITY_PAY"
}
- 商戶支付請求參數(shù)的安全注意點(diǎn):
a)請求參數(shù)的sign字段請務(wù)必在服務(wù)端完成簽名生成(不要在客戶端本地簽名);
b)支付請求中的訂單金額total_amount,請務(wù)必依賴服務(wù)端,不要輕信客戶端上行的數(shù)據(jù)(客戶端本地上行數(shù)據(jù)在用戶手機(jī)環(huán)境中無法確保一定安全)