iOS开发-如何优雅地集成支付宝支付功能

文档更新说明:

•   2016年08月03日 v1.0 初稿

前言

这篇文章不是从0开始接入支付宝SDK的教程,因为支付宝官网的官方文档已经说得很清楚了,如果您是为了找一篇接入支付宝的教程,那么这里更适合你。支付宝集成流程详解

那么这篇文章到底要表达一点什么呢?其实也就一点关于支付宝接入的注意事项而已。

1、支付信息签名应该放在服务端还是客户端?

支付宝对签名的要求是只要按照格式正确签名即可,那么这就有个问题了,我们应该把签名放在客户端还是服务器呢?从支付宝官网下载下来的demo也是把签名过程放在客户端的,很多人就会跟着在客户端做签名过程了,笔者以前也是这么做的。但是回头一想,签名过程在客户端,那也就是说需要把私钥放在客户端,这显然是很危险的,稍不留神就被别人逆向把私钥拿到了,给我们的支付安全引入了不必要的危险。

答案很明显,我们应该把签名流程放在服务器端。原因如下:

  • 1、保证私钥安全;
  • 2、免得客户端要导入那么多签名用的第三方库;
  • 3、支付宝官方文档上面说得很清楚。"出于安全考虑,请商户尽量把私钥保存在服务端,在服务端进行签名验签。"

2、移动支付和手机网页支付有什么区别和联系?

这两种支付方式是需要分别签约的,两者的支付权限是分开的。

  • 移动支付:接入SDK,通过支付宝的SDK来调起支付宝APP完成支付,如果用户没有安装支付宝APP,则打开H5支付页面;
  • 手机网页支付:打开一个支付宝的H5支付页面,支付全程在H5页面上完成。

看到这里,或许你会认为移动支付功能显然比手机网页支付强大,因为移动支付是可以在用户没安装支付宝的时候打开H5支付页面的。
实际上,手机网页支付也是可以调起APP来支付的,只要在网页支付请求参数里面加个app_pay=Y,然后支付宝就会在用户安装了支付宝APP的情况下调起支付宝APP来完成支付。
这样调是有一个缺陷的,就是用户完成或者取消支付的话,不能自动跳回我们自己的APP内。

3、怎么通过网页支付页面调起支付宝APP支付,并且在完成之后跳回我们自己的APP呢?

这种支付集成方式应该是native开发者最喜欢的了吧。要达到这种效果,需要两个必要条件:

  • 1、已经开通了网页支付权限
  • 2、已经开通了移动支付权限
  • 3、用户手机内有安装支付宝APP

3.1具体实现方式:

  • 1、 实现UIWebViewDelegate协议,拦截H5的URL;
  • 2、 调用SDK提供的“获取订单信息接口(fetchOrderInfoFromH5PayUrl)”对拦截的URL进行处理:
/**
 *  url order 获取接口
 *
 *  @param urlStr     拦截的 url string
 *
 *  @return 获取到的url order info
 */
- (NSString*)fetchOrderInfoFromH5PayUrl:(NSString*)urlStr;
  • 3、通过上面的方法,如果返回的字符串长度不为0,则说明这个链接是属于支付宝的支付链接,这时,调用支付接口,打开支付宝APP完成支付。
/**
 *  url支付接口
 *
 *  @param orderStr       订单信息
 *  @param schemeStr      调用支付的app注册在info.plist中的scheme
 *  @param compltionBlock 支付结果回调Block
 */
- (void)payUrlOrder:(NSString *)orderStr
         fromScheme:(NSString *)schemeStr
           callback:(CompletionBlock)completionBlock;
  • 例子:
- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType {
    NSString* orderInfo = [[AlipaySDK defaultService]fetchOrderInfoFromH5PayUrl:[request.URL absoluteString]];
    if (orderInfo.length > 0) {
        // 调用支付接口进行支付
        [[AlipaySDK defaultService]payUrlOrder:orderInfo fromScheme:@"alisdkdemo" callback:^(NSDictionary* result) {
            // 处理返回结果
            NSString* resultCode = result[@"resultCode"];
            //建议操作: 根据resultCode做处理
 
            // returnUrl 代表 第三方App需要跳转的成功页URL
            NSString* returnUrl = result[@"returnUrl"];
            //建议操作: 打开returnUrl
        }];
 
        return NO;
    }
    return YES;
}

总结

何为优雅?百度是这样解释的:优雅是一种和谐,类似于美丽,只不过美丽是上天的恩赐,而优雅是艺术的产物。
在编程中,用最少的代码实现最优秀的功能,这大概就是优雅吧。在本文中,如果我们能在网页端做到调用APP支付,那么对于APP开发者来说是多么优雅的编程方式,不超过20行代码就能完成支付宝的集成,并且还能在iOS、安卓和Web端复用这个支付网页。多么优雅~
这里再多说一句,吐槽一下微信的支付,还不支持H5方式的支付~