支付寶接入支付集成總結


支付寶接入支付集成總結

我會詳細的記錄每一步,以便自己以后查看復習,包括:非代碼部分、代碼部分 配置
  • 支付寶集成文檔 https://docs.open.alipay.com/204/105295/

  • SDK下載
    https://docs.open.alipay.com/54/104509

    1. 准備工作
      1> 非代碼部分的准備工作:
      接入支付:點擊螞蟻金服開放平台->點擊接入支付->將會進入登錄頁面(如果是公司開發,登錄公司提供的支付寶賬號;自己開發,登錄自己的賬號)->如果未填寫過各項信息和同意協議,這這里會需要你填入地址,手機號,郵箱,等一系列東西 -> 然后就進入到主頁里
 
1.png

在這里你可以選擇“支付接入”,創建一個支付應用

 
2.png

選擇自用型

 
3.png

創建成功的頁面

注意:這樣並不代表你的應用現在就有支付能力,許多功能需要簽約才能生效(如果公司已經有過處理,我所說的是從開始處理)

 
4.png

我們需要補全支付寶所需要的資料,然后提交審核,包括:身份證照片,和個體商戶信息,商家信息

配置公鑰私鑰,公鑰上傳支付寶

 
5.png

可點擊“查看密鑰生成”,下載生成工具生成上傳
配置應用網關:異步接受通知地址
配置授權回調地址:第三方授權或用戶信息授權后回調地址

**更加詳細文檔:https://docs.open.alipay.com/200/105310

 
6.png

非技術部分的准備工作就這些,配置好這些東西我們就可一開始技術相關的准備工作了(支付寶的文檔很全也很仔細,遇到問題,找文檔)
2> 技術相關的准備工作

  •  

     

    下載SDK,拖入兩個文件到xcode
     
    7.png
  • 根據文檔導入依賴庫:https://docs.open.alipay.com/204/105295/

  • 添加schemes 為app name 或者起一個獨一無二(應用於支付寶吊起app,這里的schemes,會在調用支付的接口中用到)

  • 因為本次項目是swift 所以還得考慮針對swift的接入
    1》只需要在橋接文件中導入 #import <AlipaySDK/AlipaySDK.h> #import <UIKit/UIKit.h>(加入UIKit的原因是會產生錯誤所以必須加入)

    1. 相關的准備工作走完成了,那么接下來是代碼時間(相對來說還是很簡單的)
      我封裝了一個管理類
      代碼需要關注幾個問題:1。私鑰不要放在前台,私鑰加簽放在后台 2. appDelegate 處理支付寶吊起回調

    2. 通過產品id,去后台獲取簽名之后的字符串

    3. 吊起支付,監聽回調

    4. 服務器驗證
      一:

      class AliPayManager: NSObject { static let manager = AliPayManager() // 調用者 fileprivate weak var sender:UIViewController? // 支付成功回調 fileprivate var paySuccess:((_ coin:String,_ diamond:String)->Void)? func aliPay(sender:UIViewController, id:String, paySuccess:@escaping (_ coin:String,_ diamond:String)->Void) { self.sender = sender self.paySuccess = paySuccess getAliPayDataSource(id: id) } 
    // 第一步服務器請求加密的簽名數據 fileprivate func getAliPayDataSource(id:String){ RequestManager.request(RequestUrl.aliPayGetSignOder.url, method: .get, parameters: ["item_id":id]).responseString { (responseData) in ResultBase<[String:String]>.parseJSON(dataResponse: responseData, currentViewController: self.sender!, errorAlertHandle: { (errorInfo, result) in self.sender?.hide() if let error = errorInfo { self.sender?.showError(error) } else { self.sender?.showError("獲取信息失敗,請稍后再試!") } }, successHandle: { (dict) in if let result = dict { let orderString = result["order_str"] if let order = orderString { self.aliPay(orderString: order, appScheme: "TexasPoker") } else { self.sender?.hide() self.sender?.showError("獲取信息失敗,請稍后再試!") } } else { self.sender?.hide() self.sender?.showError("獲取信息失敗,請稍后再試!") } } ) } } 
  /// 第二步吊起支付 fileprivate func aliPay(orderString:String, appScheme:String) { // AlipaySDK.defaultService().setUrl("https://openapi.alipaydev.com/gateway.do") AlipaySDK.defaultService().payOrder(orderString, fromScheme: appScheme) { (resultDict) -> Void in let errorCode = resultDict!["resultStatus"] as! String if errorCode == "601" { self.sender?.hide() self.sender?.showError("您取消了支付") } else if errorCode == "9000" || errorCode == "8000" { let dataString = resultDict!["result"] as! String self.clientAliPayToServer(dataString: dataString) } else { self.sender?.hide() self.sender?.showError("支付失敗") } } } 

/// 第三步服務器驗證 fileprivate func clientAliPayToServer(dataString:String){ RequestManager.request(RequestUrl.aliPayGetResult.url, method: .post, parameters: ["result": dataString]).responseString { (responseData) in self.sender?.hide() ResultBase<[String:Any]>.parseJSON(dataResponse: responseData, currentViewController: self.sender!, errorAlertHandle: { (errorInfo, resultBase) in if let error = errorInfo { self.sender?.showError(error) } else { self.sender?.showError("驗證支付失敗") } }, successHandle: { (dict) in let is_verify = dict!["is_verify"] as! Bool let diamond = (dict!["diamond"] as! NSNumber).stringValue let coin = (dict!["coin"] as! NSNumber).stringValue if is_verify { self.paySuccess!(coin, diamond) self.sender?.showSuccess(text: "支付成功") } else { self.sender?.showError("驗證支付失敗") } }) } } }

二:AppDelegate 代理方法處理支付寶吊起app
iOS 8.0之后
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation { if (!result) { if ([url.host isEqualToString:@"safepay"]) { [[AlipaySDK defaultService] processOrderWithPaymentResult:url standbyCallback:^(NSDictionary *resultDic) { NSLog(@"result = %@",resultDic); }]; } } return YES; }

iOS9 以上新方法

- (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<UIApplicationOpenURLOptionsKey,id> *)options { if ([url.host isEqualToString:@"safepay"]) { [[AlipaySDK defaultService] processOrderWithPaymentResult:url standbyCallback:^(NSDictionary *resultDic) { NSLog(@"result = %@",resultDic); }]; return YES } } 

支付寶是如何防止漏單、錯單的:附上一張圖我想是最能說明情況的

 
8.png

第一:我們會將支付成功的返回結果提交於自己服務器做驗證,后台服務器進行同步驗證,驗證交易成功
第二:防止我們不正常交易,比如沒有正確的吊起app,支付寶會異步通知后台服務器,后台服務器會進行驗簽,從而判斷是否交易成功

通過這兩種方式,基本上我們交易的訂單就不會出現支付成功了,卻導致訂單沒成功,也就是漏單

基本上支付寶支付就這些東西吧,好多,安全復雜的都是在后台進行的

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM