最近做一个项目需求有支付宝支付,以前从来没有做过支付宝支付这个功能,现在一下子加上这个需求,刚开始还是有点虚,无奈这是程序员必经的一道门槛,上网搜了很多资料,最终还是开官网开发文档好,虽然这个开发文档有挺多细节没有注释,自己也遇到不少坑。
官网:https://openhome.alipay.com/developmentDocument.htm
首先到官网下载demo,然后根据官提供的iOS集成流程一步一步来,首先将demo的几个文件拖到工程来
这两个.a文件需要在demo里面找到,如果没有添加是会报错的,刚开始自己没有添加,遇到很多看不懂的报错,在网上找了很多资料也没有解决(或许有解决方法我没有看到)
如果运行遇到几个报错的地方,就根据集成流成提供的解决方法
如果没有什么意外,都可以运行了,接下来就是生成签名什么的。对了,通常公司都会事先主册好这个支付宝开放平台的账号,如是没有那么只能自己去注册,需要填写一些公司的资料,有点烦人。
在demo里,APViewController.m里“订单模拟支付行为”,问后端同事拿了rsa2Privatek (因为注册是后端同事做了),直接添加到demo里测试模拟生成签名,ok成功了,但到自己项目时就不行了,原因是后端同事也会根据订单信息生成签名与用前端生成的签名做比对,但是是后端同事生成签名的方法错了,当是就是遇到这个坑搞了好久。生成签名一定要严格根据官方的方式生成。这里就不多说在demo“模拟生成签名” NSString *orderString = [NSString stringWithFormat:@"%@&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 = %@",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和这里写的是一致的
到这里算完成了,如果有什么问题还是多查找资料,主要还是官方文档。