- 最近作一個項目需求有支付寶支付,之前歷來沒有作過支付寶支付這個功能,如今一會兒加上這個需求,剛開始仍是有點虛,無奈這是程序員必經的一道門檻,上網搜了不少資料,最終仍是開官網開發文檔好,雖然這個開發文檔有挺多細節沒有註釋,本身也遇到很多坑。
- 官網:openhome.alipay.com/development…
- 首先到官網下載demo,而後根據官提供的iOS集成流程一步一步來,首先將demo的幾個文件拖到工程來
- 這兩個.a文件須要在demo裏面找到,若是沒有添加是會報錯的,剛開始本身沒有添加,遇到不少看不懂的報錯,在網上找了不少資料也沒有解決(或許有解決方法我沒有看到)
注:若是運行遇到幾個報錯的地方,就根據集成流成提供的解決方法
- 若是沒有什麼意外,均可以運行了,接下來就是生成簽名什麼的。對了,一般公司都會事先主冊好這個支付寶開放平臺的帳號,如是沒有那麼只能本身去註冊,須要填寫一些公司的資料,有點煩人。
- 在demo裏,APViewController.m裏「訂單模擬支付行爲」,問後端同事拿了rsa2Privatek (由於註冊是後端同事作了),直接添加到demo裏測試模擬生成簽名,ok成功了,但到本身項目時就不行了,緣由是後端同事也會根據訂單信息生成簽名與用前端生成的簽名作比對,可是是後端同事生成簽名的方法錯了,當是就是遇到這個坑搞了很久。生成簽名必定要嚴格根據官方的方式生成。這裏就很少說在demo「模擬生成簽名」 NSString *orderString = [NSStringstringWithFormat:@"%@&sign=%@「, orderInfoEncoded, signedString];是兩個拼接,必定要注意。
- 還有demo明確說明NOTE: 獲取私鑰並將商戶信息簽名,外部商戶的加簽過程請務必放在服務端,防止公私鑰數據泄露;因此簽名最後仍是放在後端生成,前端就不用考慮了。因此前端只須要經過網絡請求獲取後端的生成的簽名便可,看代碼
//這裏signature是後端生成的簽名
//另外,支付寶返回的這個json很差解析,反正我沒有所有解析出來
- (void)aliPayWith:(NSString *)signature
{
NSString *appScheme = @「這裏寫項目boudle id」;
__weak typeof(self) weakSelf = self;
// NOTE: 調用支付結果開始支付
[[AlipaySDK defaultService] payOrder:signature fromScheme:appScheme callback:^(NSDictionary *resultDic) {
MHLog(@"reslut = \n%@",resultDic);
NSInteger result = [resultDic[@"resultStatus"] integerValue];
switch (result) {
case 9000:
{
[weakSelf alerVC:@"訂單支付成功"];
}
break;
case 8000:
{
[weakSelf setupSvprogress:@"正在處理中,支付結果未知(有可能已經支付成功),請查詢商戶訂單列表中訂單的支付狀態"];
}
break;
case 4000:
{
[weakSelf setupSvprogress:@"訂單支付失敗"];
}
break;
case 5000:
{
[weakSelf setupSvprogress:@"重複請求"];
}
break;
case 6001:
{
[weakSelf setupSvprogress:@"用戶中途取消"];
}
break;
case 6002:
{
[weakSelf setupSvprogress:@"網絡鏈接出錯"];
}
break;
case 6004:
{
[weakSelf setupSvprogress:@"支付結果未知(有可能已經支付成功),請查詢商戶訂單列表中訂單的支付狀態"];
}
break;
default:
break;
}
}];
}
複製代碼
- (void)setupSvprogress:(NSString *)message
{
[SVProgressHUD setBackgroundColor:MHColorA(84, 84, 84, 0.6)];
[SVProgressHUD showErrorWithStatus:message];
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.55 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
[SVProgressHUD dismiss];
[self.navigationController popToViewController:[self.navigationController.viewControllers objectAtIndex:1] animated:YES];
});
}
複製代碼
//支付成功後
- (void)alerVC:(NSString *)message
{
UIAlertController *alerVC = [UIAlertController alertControllerWithTitle:@"提示" message:message preferredStyle:UIAlertControllerStyleAlert];
UIAlertAction *ensure = [UIAlertAction actionWithTitle:@"肯定" style:UIAlertActionStyleDestructive handler:^(UIAlertAction * _Nonnull action) {
//這裏作一個跳轉,跳轉到支付成功頁面,或者訂單支付成功後的頁面
}];
[alerVC addAction:ensure];
[self.navigationController presentViewController:alerVC animated:YES completion:nil];
}
複製代碼
- 還有一點,我當初Schemes填的不是boundle id因此支付成功後沒有回到app,這一點注意,上面代碼appScheme和這裏寫的是一致的
- 到這裏算完成了,若是有什麼問題仍是多查找資料,主要仍是官方文檔。