在iOS9上调用支付宝不回调的问题解决,以及支付宝嵌入的流程梳理

又有一段时间没有经营自己的博客了,这一段有点忙啊!

在最近的一个项目中再一次用到了第三方支付,对,就是支付宝,之前的项目其实已经实现过相应的功能,那是还是在ios8的系统下,这不在iOS9下就遇到了一个问题,不回调啊,反正要梳理支付宝的嵌入,那就先说说具体的流程吧。

我使用的支付宝SDK2.0标准版,下载相应的SDK时,除了会附带支付宝的Demo之外,还有一份文档“移动支付接口SDK2.0标准版接入和使用规则.pdf”,我们大概分3步来总结一下:

第一步:商户签约和秘钥配置;

第二步:SDK集成及xcode相关配置;

第三部:参数设置及相关调试;

接下来我们一步一步来说:

第一步:商户签约和秘要配置;

对于公司的业务一般是由公司申请企业支付宝账号,同时进行签约和相应的业务申请,这是公司该做的,作为开发者给我们的就是一组支付宝账号和密码,我们登录进去可以查看签约管理,示意图如下(注意一下我们进入之后,查看的是支付宝-商家服务,而不是支付宝-开放平台,商家服务可以理解为你为公司的支付宝签约的服务配置信息,而开放平台是给自己作为开发者用的,在开放平台中只能看到在商户服务中配置的信息)

在iOS9上调用支付宝不回调的问题解决,以及支付宝嵌入的流程梳理_第1张图片

点击查看 商户服务->签约管理->查看更多签约信息,之后则需要输入支付宝支付密码才能看见PID和Key等内容(支付宝付费账号是单独设置的,和登录密码不一定相同,试了3遍会被锁定的,最好事先确定一下),之后我们会看到这样一个界面:

在iOS9上调用支付宝不回调的问题解决,以及支付宝嵌入的流程梳理_第2张图片

这个界面就是我们获取PID和设置秘钥的地方;

接下来就是这个秘钥怎么配的问题了,如上图中所标注的,我们需要添加RSA加密的公钥,作为支付宝的公钥;

在我们下载的SDKDemo中有一个openssl的文件夹,其中包含了windows下的生成秘钥的工具,我是在Mac电脑上操作的,直接在终端上敲命令就行,在根目录下就会生成一组.pem格式的秘钥,一个是私钥,一个是公钥,再用命令生成PKCS8格式的私钥,会直接显示在终端上,保存到一个记事本里保存好,那现在我们手里就有了3个秘钥:

rsa_private_key.pem;

rsa_public_key.pem;

PKCS8编码之后的私钥(字符串);

其中,PKCS8编码之后的私钥会在app中作为参数privateKey传入,RSA加密的公钥就是前面我们说的要添加作为支付宝公钥的;

好了,第一步就完成了;


第二步:SDK集成及xcode相关配置:

对于继承的流程,文档上有很详尽的描述,一般我的做法就是把Demo中给的这几个文件拖进应用:

在iOS9上调用支付宝不回调的问题解决,以及支付宝嵌入的流程梳理_第3张图片在iOS9上调用支付宝不回调的问题解决,以及支付宝嵌入的流程梳理_第4张图片

这个order类也是从Demo中拷出来的;

在导入SDK之后,还需要在Header Search Paths增加头文件路径,引入支持的系统库,Info-UIL Types中增加URL Schemes,同时还要进行ios9的适配,在Info plist文件中增加LSApplicationQueriesSchemes数组属性,增加两个值:alipay和alipayshare...反正就是正常做就行了;

这里完成了上述的步骤之后,run一下,发现竟然跑不了,报错了(是不是很郁闷!)

Undefined symbols for architecture armv7:
  "_OBJC_CLASS_$_UTDevice", referenced from:
      objc-class-ref in AlipaySDK
ld: symbol(s) not found for architecture armv7
clang: error: linker command failed with exit code 1 (use -v to see invocation)
具体解决过程就不提了,在链接的系统库中增加CoreMotion.framework就好了。

这下可以编译通过了,第二步也完成了;


第三部:参数设置及相关调试:

按照Demo中的请求调用支付宝支付,我们需要若干参数:

partner:合作身份者ID,以2088开头,也就是前面我们提到的PID;

seller:商家的支付宝收款账号;

privateKey:还记得那个PKCS8格式的秘钥吗,对,就是他;

order.tradeNO:这个订单内容编码是最终要传给服务端的,其中根据不同的业务需求可能会传订单Id,用户Id,优惠券Id等信息,支付宝回调服务端之后,进行入库;

order.productName:可以作为产品业务名;

order.productionDescription:可以作为产品业务描述;

order.amount:这是最重要的“钱”,千万别算错了,会出大问题的,别问我是怎么知道的^_^;

order.notifyURL:这个是支付宝回调服务端的地址,找服务端要就行了;

appScheme:前面配置的URL Schemes中的字符串,写在这就行了;

这样参数就基本齐全了,很开心对吧,接下来就要处理回调了,需要在两个地方处理回调:

一个是进行支付时的callback的block回调,这个是调用SDK时的回调(没安装应用的);

另一个是appdelegate中的这个方法中:

- (BOOL)application:(UIApplication *)application
            openURL:(NSURL *)url
  sourceApplication:(NSString *)sourceApplication
         annotation:(id)annotation
添加如下代码:

/**
         9000 订单支付成功 8000 正在处理中 4000 订单支付失败 6001 用户中途取消 6002 网络连接出错
         */
        //*支付宝
        //如果极简 SDK 不可用,会跳转支付宝钱包进行支付,需要将支付宝钱包的支付结果回传给 SDK
        if ([url.host isEqualToString:@"safepay"]) {
            
            [[AlipaySDK defaultService]processAuth_V2Result:url standbyCallback:^(NSDictionary *resultDic) {
                [[NSNotificationCenter defaultCenter]postNotificationName:k_Noti_transeAlipayCallBackResault object:resultDic];
            }];
            [[AlipaySDK defaultService] processOrderWithPaymentResult:url standbyCallback:^(NSDictionary *resultDic) {
                NSLog(@"result = %@",resultDic);
                [[NSNotificationCenter defaultCenter]postNotificationName:k_Noti_transeAlipayCallBackResault object:resultDic];
            }];
        }
        if ([url.host isEqualToString:@"platformapi"]){//支付宝钱包快登授权返回 authCode
            [[AlipaySDK defaultService] processAuthResult:url standbyCallback:^(NSDictionary *resultDic) {
                NSLog(@"result = %@",resultDic);
                [[NSNotificationCenter defaultCenter]postNotificationName:k_Noti_transeAlipayCallBackResault object:resultDic];
            }];
        }
这个是跳转到支付宝应用返回当前应用的回调处理,三个判断对应三种不同情况:其实正常的情况下只有第二个会走,第三个从url.host就可以看出来,是处理登录授权的(其他人都有这个判断,姑且放着吧),至于第一个判断我记得是如果应用被干掉,也会有回调,但是鉴于我对回调的处理方式是通过通知发回发起支付的界面,所以这个判断实际上也没什么意义;

在具体界面处理具体通知,根据不同的状态码处理就行了;

第三步也完成了,按照之前排练的进行付费,之后就等着能华丽丽的收场,结果...你错了,竟然不回调,对,就是不回调,瞬间好心情全没了^_^;

终端上只是孤零零的输出了“retryHandleOpenURL”

3步都完成了,就差回调的处理了,各种搜索,最后在简书上有个人处理了这个问题(毕竟人家是作者,把链接附在这了http://www.jianshu.com/p/3ce4561ae7be)

解决的方法就是在iOS9下,这个方法才是可靠的

- (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<NSString*, id> *)options 
把上边的处理代码考到这个方法中一份就可以了^_^


感谢俊哥的帮助,使这篇博客成为了可能,谢谢!也希望对大家有帮助。



你可能感兴趣的:(ios,支付宝)