• 支付宝支付


    下载:
    https://doc.open.alipay.com/doc2/detail?treeId=54&articleId=103419&docType=1

    文档:
    压缩包里应该有两个压缩文档
    <支付宝钱包支付接口开发包2.0标准版>
    <支付宝钱包支付接口开发包2.0标准版接入与使用规则>
    iOS 相关内容可以直接看第一个文档,第二个文档名字和里面写的不一样,内容其实是一个附录;
    文档里面多个平台都涉及到了,内容有些杂乱。

    下面我用几幅图来给大家展示一下客户端调起支付的过程:

    1.买家在手机应用中购买商品或者是服务

    2.买家选择支付方式

    3.进入支付宝收银台进行付款

    4.支付成功

    5.交易完成,买家可以查看交易信息

    在调用支付之前,将商品数据信息生成待签名的字符串,信息包括:

    {

    }

    如何声明密钥请看文档:

    http://doc.open.alipay.com/doc2/detail?treeId=58&articleId=103242&docType=1

    1.安装OpenSSL工具

    2.RSA私钥及公钥生成

    RSA加密算法除了可以加解密外,还可以用来做签名校验。简单的说,RSA会生成一个私钥和一个公钥,私钥你应该独自保管,公钥你可以分发出去。做签名验证时,你可以用私钥对需要传输的数据做签名加密,生成一个签名值,之后分发数据,接收方通过公钥对签名值做校验,如果一致则认为数据无篡改.

    具体到支付宝使用RSA做签名验证,就是在生产订单的时候,需要使用私钥生成签名值;在处理返回的支付结果时,需要使用公钥验证返回结果是否被篡改了。具体需要对哪些值,怎么样生成签名,对哪些值做签名验证,可以在第一个文档中找找,后面我会简单提一下,但还是以文档或实践为准吧。

    订单签名:

    上面说了,订单签名应该使用私钥,但是把私钥放在app里其实是不安全的,因为你的app是分发到用户手里的,私钥应该放在你的手里,分发出去的应该是公钥。所以私钥最好是放在自己的服务器上,订单加密这个工作放在服务器来做,服务器将包含签名的订单信息返回给app,app再通过SDK发送给支付宝,这样会更安全一些;而且服务器也能掌握所有的订单状况。

    如果你非要将私钥集成到app里,那可以参考SDK的demo,因为这个demo就是在app本地通过私钥做的订单签名。

    支付结果签名验证

    上面的回调block提到了返回的内容,返回的支付结果中的result字段里是带有订单信息和签名信息的,所以签名验证就是需要这个字段的值。
    文档中有一个这个字段的例子,实际结果没有换行,我换一行便于阅读:

    partner=”2088101568358171”&seller_id=”xxx@alipay.com”&out_trade_no=”0819145412-6177”&subject= &sign_type=”RSA” &sign=”hkFZr+zE9499nuqDNLZEF7W75RFFPsly876QuRSeN8WMaUgcdR00IKy5ZyBJ4eldhoJ/2zghqrD4E2G2mNjs3aE”

    这个签名当中分为三部分

    第一部分是订单信息,每个字段的具体含义可以再文档里找;
    中间sign_type 是签名所用的算法,文档中提到,目前只是支持RSA;
    最后的sign就是签名值。

    验证的步骤如下:

    首先把订单信息和签名值分别提取出来(SDK中并没有给进行处理)

    订单信息就是sign_type的连字符&之前的所有字符串
    
    签名值是sign后面双引导的内容,注意签名的结尾也是 = ,所以不要用split字符串的方法提取
    

    支付SDK

    如果只需要发送订单和处理支付返回结果,只需要添加AlipaySDK.bundle 和 Alipay.framework 就行了。

    发送订单的方法:

    • (void)payOrder:(NSString )orderStr fromScheme:(NSString )schemeStr
      callback:(CompletionBlock)completionBlock

    此时需要注意:

    如果手机内没有安装支付宝的app,会直接展现支付宝web支付页面,通过callback返回支付结果;

    如果手机内安装了支付宝的app,会跳转到支付宝的app支付,然后通过openUrl的回调返回支付结果.

    支付宝的SDK只给了一个处理返回结果的方法,而不会像其他的第三方SDK提供一个处理openUrl的方法,所以你需要通过demo或者在第二个文档里找到处理openUrl的方式:

    if ([url.host isEqualToString:@”safepay”]) {
    [[AlipaySDK defaultService] processOrderWithPaymentResult:url standbyCallback:^(NSDictionary *resultDic) {
    }]; }

    SDK也提供了一个处理openUrl返回结果的方法

    • (void)processOrderWithPaymentResult:(NSURL *)resultUrl standbyCallback:(CompletionBlock)completionBlock;

    两个回调block都统一定义为typedef void(^CompletionBlock)(NSDictionary *resultDic);
    返回了一个字典,但是SDK里完全没有提示有哪些Key.

    我们来看一下resultStatus 状态码分别代码什么意思,这个是在文档中没有的

    9000 订单支付成功

    8000 正在处理中

    4000 订单支付失败

    6001 用户中途取消

    6002 网络连接出错

    memo 提示信息, 比如说状态码为 6001时,memo就是“用户中途取消的意思”,但是我们在开发中绝对不能依赖于这个信息,如果未安装支付宝的app,采用网页支付时,取消时状态码是 6001,但这个memo是空的。

    result 订单信息,以及签名验证信息.如果你不想做签名验证,这个字段可以忽略不计了。

    最怕你一生碌碌无为 还安慰自己平凡可贵
  • 相关阅读:
    js反爬:请开启JavaScript并刷新该页
    VIEWSTATE等参数处理
    VM+CentOS+Hadoop+Spark集群搭建
    从入门到自闭之Python入门
    从入门到自闭之Python软件命名规范
    从入门到自闭之Python序列化
    从入门到自闭之Python名称空间
    从入门到自闭之Python函数初识
    从入门到自闭之Python随机模块
    从入门到自闭之Python时间模块
  • 原文地址:https://www.cnblogs.com/fakeCoder/p/5113524.html
Copyright © 2020-2023  润新知