新版支付寶總結

整個支付邏輯分為兩個部分

1.通過跳轉支付寶APP完成支付
     新版需要appID 和  privateKey
2.通過手機網頁完成支付
     和舊版一樣需要pid appID 和  privateKey

對訂單模型order的總結

訂單模型中分為兩個部分
商品模型

@interface BizContent : NSObject

// NOTE: (非必填項)商品描述
@property (nonatomic, copy) NSString *body;

// NOTE: 商品的標題/交易標題/訂單標題/訂單關鍵字等。
@property (nonatomic, copy) NSString *subject;

// NOTE: 商戶網站唯一訂單號
@property (nonatomic, copy) NSString *out_trade_no;

// NOTE: 該筆訂單允許的最晚付款時間,逾期將關閉交易。
//       取值范圍:1m~15d m-分鐘,h-小時,d-天,1c-當天(1c-當天的情況下,無論交易何時創建,都在0點關閉)
//       該參數數值不接受小數點, 如1.5h,可轉換為90m。
@property (nonatomic, copy) NSString *timeout_express;

// NOTE: 訂單總金額,單位為元,精確到小數點后兩位,取值范圍[0.01,100000000]
@property (nonatomic, copy) NSString *total_amount;

// NOTE: 收款支付寶用戶ID。 如果該值為空,則默認為商戶簽約賬號對應的支付寶用戶ID (如 2088102147948060)
@property (nonatomic, copy) NSString *seller_id;

// NOTE: 銷售產品碼,商家和支付寶簽約的產品碼 (如 QUICK_MSECURITY_PAY)
@property (nonatomic, copy) NSString *product_code;

@end

訂單模型

@interface Order : NSObject

// NOTE: 支付寶分配給開發者的應用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: 參數編碼格式,如utf-8,gbk,gb2312等
@property (nonatomic, copy) NSString *charset;

// NOTE: 請求發送的時間,格式"yyyy-MM-dd HH:mm:ss"
@property (nonatomic, copy) NSString *timestamp;

// NOTE: 請求調用的接口版本,固定為:1.0
@property (nonatomic, copy) NSString *version;

// NOTE: (非必填項)支付寶服務器主動通知商戶服務器里指定的頁面http路徑
@property (nonatomic, copy) NSString *notify_url;

// NOTE: (非必填項)商戶授權令牌,通過該令牌來幫助商戶發起請求,完成業務(如201510BBaabdb44d8fd04607abf8d5931ec75D84)
@property (nonatomic, copy) NSString *app_auth_token;

// NOTE: 具體業務請求數據
@property (nonatomic, strong) BizContent *biz_content;

// NOTE: 簽名類型
@property (nonatomic, copy) NSString *sign_type;


/**
 *  獲取訂單信息串
 *
 *  @param bEncoded       訂單信息串中的各個value是否encode
 *                        非encode訂單信息串,用于生成簽名
 *                        encode訂單信息串 + 簽名,用于最終的支付請求訂單信息串
 */
- (NSString *)orderInfoEncoded:(BOOL)bEncoded;

@end

快速完成支付功能步驟(通過跳轉支付寶APP方式)(步驟一和二在服務器完成)

步驟1:生成訂單信息. 調用order.m里的函數description將商品信息拼接成字符串作為待簽名字符串,如:

app_id=2015052600090779&biz_content={"timeout_express":"30m","seller_id":"","product_code":"QUICK_MSECURITY_PAY","total_amount":"0.02","subject":"1","body":"我是測試數據","out_trade_no":"ZQLM3O56MJD4SK3"}&charset=utf-8&method=alipay.trade.app.pay&sign_type=RSA&timestamp=2016-07-28 20:36:11&version=1.0

步驟2:對訂單信息簽名. 使用類CreateRSADataSigner,調用signString簽名函數做簽名,如:

 // 獲取私鑰并將商戶信息簽名,外部商戶可以根據情況存放私鑰和簽名,只需要遵循RSA簽名規范,并將簽名字符串base64編碼和UrlEncode
    id<DataSigner> signer = CreateRSADataSigner(privateKey);
    NSString *signedString = [signer signString:authInfoStr];

步驟3:把簽名結果賦值給參數sign,并把sign加入之前的待簽名數組中,此時得到的便是要請求給支付寶的全部數據。

app_id=2015052600090779&biz_content={"timeout_express":"30m","seller_id":"","product_code":"QUICK_MSECURITY_PAY","total_amount":"0.02","subject":"1","body":"我是測試數據","out_trade_no":"ZQLM3O56MJD4SK3"}&charset=utf-8&method=alipay.trade.app.pay&sign_type=RSA&timestamp=2016-07-28 20:36:11&version=1.0&sign=*********

步驟4:調用(AlipaySDK *)defaultService類下面的支付接口函數,喚起支付寶支付頁面。

(void)payOrder:(NSString *)orderStr
  fromScheme:(NSString *)schemeStr
    callback:(CompletionBlock)completionBlock
appScheme為app在info.plist注冊的scheme。

步驟5:當這筆交易被買家支付成功后支付寶收銀臺上顯示該筆交易成功,并提示用戶“返回”。此時在APAppDelegate.m的 - (BOOL)application:(UIApplication )application openURL:(NSURL )url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation 中調用獲取返回數據的代碼【iOS9.0以上(包括iOS9.0)需要在 - (BOOL)application:(UIApplication *)app openURL:(NSURL )url options:(NSDictionary<NSString, id> *)options 中執行 】:

[[AlipaySDK defaultService]
processOrderWithPaymentResult:url
standbyCallback:^(NSDictionary *resultDic) {
NSLog(@"result = %@",resultDic);//返回的支付結果
//【由于在跳轉支付寶客戶端支付的過程中,商戶app在后臺很可能被系統kill了,所以pay接口的callback就會失效,請商戶對standbyCallback返回的回調結果進行處理,就是在這個方法里面處理跟callback一樣的邏輯】
}];

快速完成支付功能步驟(通過網頁完成方式)

步驟1:生成APAuthV2Info對象, 將授權信息拼接成字符串作為待簽名字符串,如:

  //生成 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;
    }
    
    //應用注冊scheme,在AlixPayDemo-Info.plist定義URL types
    NSString *appScheme = @"alisdkdemo";
    
    // 將授權信息拼接成字符串
    NSString *authInfoStr = [authInfo description];
    NSLog(@"authInfoStr = %@",authInfoStr);

步驟2:使用類CreateRSADataSigner,調用signString簽名函數做簽名,如:

 // 獲取私鑰并將商戶信息簽名,外部商戶可以根據情況存放私鑰和簽名,只需要遵循RSA簽名規范,并將簽名字符串base64編碼和UrlEncode
    id<DataSigner> signer = CreateRSADataSigner(privateKey);
    NSString *signedString = [signer signString:authInfoStr];

步驟3:把簽名結果賦值給參數sign,并把sign加入之前的待簽名數組中,此時得到的便是要請求給支付寶的全部數據。

app_id=2015052600090779&biz_content={"timeout_express":"30m","seller_id":"","product_code":"QUICK_MSECURITY_PAY","total_amount":"0.02","subject":"1","body":"我是測試數據","out_trade_no":"ZQLM3O56MJD4SK3"}&charset=utf-8&method=alipay.trade.app.pay&sign_type=RSA&timestamp=2016-07-28 20:36:11&version=1.0&sign=*********

步驟4:調用(AlipaySDK *)defaultService類下面的支付接口函數,喚起支付寶支付頁面。

// 將簽名成功字符串格式化為訂單字符串,請嚴格按照該格式
   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(@"授權結果 authCode = %@", authCode?:@"");
                                           }];

步驟5:當這筆交易被買家支付成功后支付寶收銀臺上顯示該筆交易成功,并提示用戶“返回”。此時在APAppDelegate.m的 - (BOOL)application:(UIApplication )application openURL:(NSURL )url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation 中調用獲取返回數據的代碼【iOS9.0以上(包括iOS9.0)需要在 - (BOOL)application:(UIApplication *)app openURL:(NSURL )url options:(NSDictionary<NSString, id> *)options 中執行 】:

[[AlipaySDK defaultService]
processOrderWithPaymentResult:url
standbyCallback:^(NSDictionary *resultDic) {
NSLog(@"result = %@",resultDic);//返回的支付結果
//【由于在跳轉支付寶客戶端支付的過程中,商戶app在后臺很可能被系統kill了,所以pay接口的callback就會失效,請商戶對standbyCallback返回的回調結果進行處理,就是在這個方法里面處理跟callback一樣的邏輯】
}];

App支付iOS調用說明

快捷訂單支付iOS
處理客戶端返回url
回調接口
接口名稱:AlipaySDK

接口描述:提供支付功能。

Alipay接口主要為商戶提供訂單支付功能。接口所提供的方法,如下表所示:

方法名稱    方法描述
+(Alipay *)defaultService;  獲取服務實例。
-(void)payOrder:(NSString *)orderStr fromScheme:(NSString *)schemeStr callback:(CompletionBlock)completionBlock;    支付并通過回調返回結果。
-(void)processOrderWithPaymentResult:(NSURL*)resultUrl standbyCallback:(CompletionBlock)completionBlock;    處理支付寶客戶端返回的url(在app被殺模式下,通過這個方法獲取支付結果)。
快捷訂單支付iOS
方法名稱:pay方法

方法原型:(void)payOrder:(NSString *)orderStr fromScheme:(NSString *)schemeStr callback:(CompletionBlock)completionBlock;

方法功能:提供給商戶快捷訂單支付功能。

參數名稱    參數描述
NSString* scheme    商戶程序注冊的URL protocol,供支付完成后回調商戶程序使用。
(CompletionBlock)completionBlock    快捷支付開發包回調函數,返回免登、支付結果。本地未安裝支付寶客戶端,或未成功調用支付寶客戶端進行支付的情況下(走H5收銀臺),會通過該completionBlock返回支付結果。相應的結果參考"客戶端同步返回"。
NSString* orderString   app支付請求參數字符串,主要包含商戶的訂單信息,key=value形式,以&連接。
orderStr示例如下,參數說明見"請求參數說明":
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&timestamp=2016-08-15%2012%3A12%3A15&version=1.0&sign=MsbylYkCzlfYLy9PeRwUUIg9nZPeN9SfXPNavUCroGKR5Kqvx0nEnd3eRmKxJuthNUx4ERCXe552EV9PfwexqW%2B1wbKOdYtDIb4%2B7PL3Pc94RZL0zKaWcaY3tSL89%2FuAVUsQuFqEJdhIukuKygrXucvejOUgTCfoUdwTi7z%2BZzQ%3D
處理客戶端返回url

方法名稱:處理客戶端方法

方法原型:-(void)processOrderWithPaymentResult:(NSURL*)resultUrl standbyCallback:(CompletionBlock)completionBlock;

方法功能:設備已安裝支付寶客戶端情況下,處理支付寶客戶端返回的url(在app被殺模式下,通過這個方法獲取支付結果)。

注意:該方法必須實現,否則將會導致在安裝手機支付寶的情況下,支付結果無法正常同步返回。

參數名稱    參數描述
NSURL *resultUrl    支付寶客戶端回傳的url
CompletionBlock completionBlock 本地安裝了支付寶客戶端,且成功調用支付寶客戶端進行支付的情況下,會通過該completionBlock返回支付結果
備注:請在APPDelegate的 - (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation 中調用該方法,iOS9.0以上(包括iOS9.0)請在 - (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<NSString*, id> *)options 中調用該方法,具體可參見Demo。

回調接口

在支付過程結束后,會通過callbackBlock同步返回支付結果(callbackBlock是調用支付同步的回調)。支付結果中參數的提取,必須通過CompletionBlock獲取,禁止開發者私自解析支付結果返回的URL,參數說明見"客戶端同步返回"。

其他接入方式

概述
對比
如果您已經接入了手機網站支付,除了“集成流程詳解”中介紹的接入方式,支付寶推薦另一種更為便利的SDK接入方式——手機網站支付轉為Native支付。

概述

如果您已經接入支付寶手機網站支付,可以通過接入我們的SDK將手機網站支付轉為Native支付。接入過程極其簡單,只需攔截手機網站支付的url,將該url轉交給SDK進行處理;無需接入者解析參數字段,接入者的服務端也無需改造。

為什么要將手機網站支付轉為Native支付? Native支付的用戶體驗和支付成功率均優于手機網站支付。

對比

下面以淘寶為例對比手機網站支付和手機網站轉Native支付的流程。

手機網站支付流程

步驟一: 在手機端瀏覽器中訪問淘寶主頁www.taobao.com


步驟二: 挑選商品并進行付款


步驟三: 點擊“立即支付”進入付款詳情頁面(H5頁面)


手機網站轉Native支付流程

下載Demo,并將Demo App安裝到手機上即可體驗該流程,請確保手機上安裝了支付寶App。

步驟一: 運行Demo,并在Demo中打開淘寶主頁www.taobao.com
iOS: 點擊URLPay->openUrl,輸入www.taobao.com


Android: 點擊網頁支付轉native

步驟二: 挑選商品并進行付款
iOS截圖



Android截圖


對比總結

主要區別是:如果用戶手機安裝了支付寶App,手機網站轉Native支付方式會跳轉到支付寶App中進行訂單支付,用戶體驗和支付成功率均優于手機網站支付方式。除此之外,還能使用手機網站支付沒有提供的功能,例如:指紋支付、手環、手表支付、免密支付等。

如果用戶手機沒有安裝支付寶App怎么辦? 如果用戶手機沒有安裝支付寶App,將在SDK提供的WebView中打開H5頁面進行支付。即便如此,由于SDK與服務端的交互攜帶賬號信息,仍比不攜帶任何賬號信息的普通手機網站支付體驗更好。

如何實現手機網站轉Native支付

要實現上述功能需接入我們提供的SDK。

接入過程十分簡單,可以以上述Demo為參考,該Demo程序只有一個功能:創建一個WebView,在WebView中攔截每個URL,然后調用SDK提供的接口檢查該URL是否是有效的支付寶訂單支付URL,如果是則將該URL傳給SDK提供的支付接口進行支付。

支付寶請求參數說明

接口功能:外部商戶App喚起快捷SDK創建訂單并支付。

請求參數是商戶在與支付寶進行數據交互時,提供給支付寶的請求數據,以便支付寶根據這些數據進一步處理。

公共參數 -- order

參數 類型 是否必填 最大長度 描述 示例值
app_id String 是 32 支付寶分配給開發者的應用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 商戶請求參數的簽名串,詳見簽名 詳見示例
timestamp String 是 19 發送請求的時間,格式"yyyy-MM-dd HH:mm:ss" 2014-07-24 03:07:50
version String 是 3 調用的接口版本,固定為:1.0 1.0
notify_url String 是 256 支付寶服務器主動通知商戶服務器里指定的頁面http/https路徑。建議商戶使用https https://api.xx.com/receive_notify.htm
biz_content String 是 - 業務請求參數的集合,最大長度不限,除公共參數外所有請求參數都必須放在這個參數中傳遞,具體參照各產品快速接入文檔

業務參數 -- biz_content

參數 類型 是否必填 最大長度 描述 示例值
body String 否 128 對一筆交易的具體描述信息。如果是多種商品,請將商品描述字符串累加傳給body。 Iphone6 16G
subject String 是 256 商品的標題/交易標題/訂單標題/訂單關鍵字等。 大樂透
out_trade_no String 是 64 商戶網站唯一訂單號 70501111111S001111119
timeout_express String 否 6 該筆訂單允許的最晚付款時間,逾期將關閉交易。取值范圍:1m~15d。m-分鐘,h-小時,d-天,1c-當天(1c-當天的情況下,無論交易何時創建,都在0點關閉)。 該參數數值不接受小數點, 如 1.5h,可轉換為 90m。 90m
total_amount String 是 9 訂單總金額,單位為元,精確到小數點后兩位,取值范圍[0.01,100000000] 9.00
seller_id String 否 16 收款支付寶用戶ID。 如果該值為空,則默認為商戶簽約賬號對應的支付寶用戶ID 2088102147948060
product_code String 是 64 銷售產品碼,商家和支付寶簽約的產品碼 QUICK_MSECURITY_PAY
請求示例

請求參數組裝分下列3步,以最后第三步獲取到的請求為準

  1. 請求參數按照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":"我是測試數據","out_trade_no":"IQJZSRC1YMQB5HU"}&charset=utf-8&format=json&method=alipay.trade.app.pay&notify_url=http://domain.merchant.com/payment_notify&sign_type=RSA&timestamp=2016-08-25 20:26:31&version=1.0
  1. 再對原始字符串進行簽名,參考 簽名規則:
app_id=2015052600090779&biz_content={"timeout_express":"30m","seller_id":"","product_code":"QUICK_MSECURITY_PAY","total_amount":"0.01","subject":"1","body":"我是測試數據","out_trade_no":"IQJZSRC1YMQB5HU"}&charset=utf-8&format=json&method=alipay.trade.app.pay&notify_url=http://domain.merchant.com/payment_notify&sign_type=RSA&timestamp=2016-08-25 20:26:31&version=1.0&sign=cYmuUnKi5QdBsoZEAbMXVMmRWjsuUj+y48A2DvWAVVBuYkiBj13CFDHu2vZQvmOfkjE0YqCUQE04kqm9Xg3tIX8tPeIGIFtsIyp/M45w1ZsDOiduBbduGfRo1XRsvAyVAv2hCrBLLrDI5Vi7uZZ77Lo5J0PpUUWwyQGt0M4cj8g=
  1. 最后對請求字符串的所有一級value(biz_content作為一個value)進行encode,編碼格式按請求串中的charset為準,沒傳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&notify_url=http%3A%2F%2Fdomain.merchant.com%2Fpayment_notify&sign_type=RSA&timestamp=2016-08-25%2020%3A26%3A31&version=1.0&sign=cYmuUnKi5QdBsoZEAbMXVMmRWjsuUj%2By48A2DvWAVVBuYkiBj13CFDHu2vZQvmOfkjE0YqCUQE04kqm9Xg3tIX8tPeIGIFtsIyp%2FM45w1ZsDOiduBbduGfRo1XRsvAyVAv2hCrBLLrDI5Vi7uZZ77Lo5J0PpUUWwyQGt0M4cj8g%3D

特殊說明(很重要)

  1. 商戶在請求參數中,自己附屬的一些額外參數,不要和支付寶系統中約定的key(下表中 公共請求參數\請求參數)重名,否則將可能導致未知的異常。
    比如以下示例中app_id=2014072300007148******&version=1.0&biz_content的key是公共請求參數,業務方自己的擴展參數需要放在biz_content內部,比如示例中tips屬性,很顯然下面total_amount屬性是商戶按照自己的業務屬性賦值的,但是由于total_amount也是支付寶關鍵key,支付寶將會認為這個total_amount是支付寶業務的參數應該是金額,這個最終將導致誤解析。下列請求串為了展示清晰,未進行encode并且做了格式化處理,下同。
app_id=2014072300007148&charset=UTF-8&version=1.0&timestamp=2016-07-01 08:08:08&method=alipay.trade.wap.pay&notify_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":"一共花費了10元",
    "seller_id":"2088102147948060",
    "auth_token":"appopenBb64d181d0146481ab6a762c00714cC27",
    "product_code":"QUICK_MSECURITY_PAY",
    "tips":"測試一筆支付"
  }
  1. 商戶的請求參數中,所有的key(支付寶關鍵key或者商戶自己的key),其對應的value中都不應該出現支付寶關鍵key,否則該類交易將可能被支付寶攔截禁止支付。
    比如以下的請求中"subject":"大樂透 這個辣條不錯 out_trade_no=123 total_fee=123.5",其value值中有支付寶關鍵key"out_trade_no"、"total_fee",這樣的業務請求參數支付寶將會攔截。
app_id=2014072300007148&charset=UTF-8&version=1.0&timestamp=2016-07-01 08:08:08&method=alipay.trade.wap.pay&notify_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"
  }
  1. 商戶支付請求參數的安全注意點:
    a)請求參數的sign字段請務必在服務端完成簽名生成(不要在客戶端本地簽名);
    b)支付請求中的訂單金額total_amount,請務必依賴服務端,不要輕信客戶端上行的數據(客戶端本地上行數據在用戶手機環境中無法確保一定安全)
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容