zoukankan      html  css  js  c++  java
  • iOS-iOS 支付 [支付宝、银联、微信](转)

    支付宝iOSsdk官方下载sdk地址:https://b.alipay.com/order/productDetail.htm?productId=2013080604609654&tabId=4#ps-tabinfo-hash

    快捷支付(无线)是一种程序式的支付方式,在手机、掌上电脑等无线设备的应用程序内,买家可通过支付宝进行付款购买特定服务或商品,资金即时到账。

    第一步:

    1 公司账户:企业支付宝账号就申请 注册企业账号,如果是个人账户,就申请个体工商户

    接入前准备阶段

      1. 商户签约审核
        签约审核具体步骤请参见签约与审核
      2. 商户密钥管理
        密钥作用
        1. 生成步骤
        2. 上传步骤

    正式接入阶段

    服务端 负责生成订单及签名,及接受支付异步通知。
    客户端 负责使用服务端传来的订单信息调用支付宝支付接口,及根据SDK同步返回的支付结果展示结果页。

    服务端接入

    私钥必须放在服务端,签名过程必须放在服务端。

    1. 准备
      1. 确定开发语言
      2. 确定编码格式
      3. 确定签名方式(PID + 密钥)
      4. 确定服务器配置
    2. 支付订单参数拼装及加签
    3. 通知处理什么时候会通知?收到通知时注意验签。

    客户端接入

      1. iOS接入
        1. 接口说明
        2. Demo示例(为了demo方便请求参数拼装和加签都放在了客户端, 应该都放服务端
      2. Android接入
        1. 接口说明
        2. Demo示例(为了demo方便请求参数拼装和加签都放在了客户端, 应该都放服务端
      3. 请求参数说明
      4. 结果参数说明

    导入代码

    更新时间:2015/11/05 访问次数:58075
     

    步骤1:启动IDE(如Xcode),把iOS包中的压缩文件中以下文件拷贝到项目文件夹下,并导入到项目工程中。

    1
    2
    AlipaySDK.bundle
    AlipaySDK.framework

    在Build Phases选项卡的Link Binary With Libraries中,增加以下依赖:

    image

    其中,需要注意的是:

    • 如果是Xcode 7.0之后的版本,需要添加libc++.tbd、libz.tbd;
    • 如果是Xcode 7.0之前的版本,需要添加libc++.dylib、libz.dylib(如下图)。
      image

    步骤2:在需要调用AlipaySDK的文件中,增加头文件引用。

    1
    #import <AlipaySDK/AlipaySDK.h>

    如果你的app基于9.0编译,那么为了适配iOS9.0中的App Transport Security(ATS)对http的限制,这里需要对支付宝的请求地址alipay.com、alipayobjects.com做例外,在app对 应的info.list中添加如下配置(文中以XML格式描述)。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    <key>NSAppTransportSecurity</key>
        <dict>
            <key>NSExceptionDomains</key>
            <dict>
                <key>alipay.com</key>
                <dict>
                    <key>NSIncludesSubdomains</key>
                    <true/>
                    <key>NSTemporaryExceptionAllowsInsecureHTTPLoads</key>
                    <true/>
                    <key>NSTemporaryExceptionMinimumTLSVersion</key>
                    <string>TLSv1.0</string>
                    <key>NSTemporaryExceptionRequiresForwardSecrecy</key>
                    <false/>
                </dict>
                <key>alipayobjects.com</key>
                <dict>
                    <key>NSIncludesSubdomains</key>
                    <true/>
                    <key>NSTemporaryExceptionAllowsInsecureHTTPLoads</key>
                    <true/>
                    <key>NSTemporaryExceptionMinimumTLSVersion</key>
                    <string>TLSv1.0</string>
                    <key>NSTemporaryExceptionRequiresForwardSecrecy</key>
                    <false/>
                </dict>
            </dict>
        </dict>

    说明:

    如果商户配置了如下的配置:

    1
    2
    3
    4
    <key>NSAppTransportSecurity</key>
        <dict>   
            <key>NSAllowsArbitraryLoads</key><true/>
        </dict>

    则上述的NSAppTransportSecurity可以不配置。

    步骤3:对接,对接之前,需要索取后台的很多信息

    //合作身份者id,以2088开头的16位纯数字
    #define PartnerID           @"2088一串数字"
    //收款支付宝账号/接口名称
    #define SellerID            @"2944983890@qq.com"

    //支付宝公钥
    #define AlipayPubKey        @"MIGf一串很长很长信息"

    //商户私钥,自助生成
    #define PartnerPrivKey   @"很长很长很长"

    //服务器异步通知页面路径/支付结果,支付宝会通知服务器
    alipayNotifServerURL = @"一个网址"
     
     

    步骤4:配置请求信息。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    Order *order = [[Order alloc] init];
    order.partner = partner;
    order.seller = seller;
    order.tradeNO = [self generateTradeNO]; //订单ID(由商家?自?行制定)
    order.productName = product.subject; //商品标题
    order.productDescription = product.body; //商品描述
    order.amount = [NSString stringWithFormat:@"%.2f",product.price]; //商
    品价格
    order.notifyURL = @"http://www.xxx.com"; //回调URL
    order.service = @"mobile.securitypay.pay";
    order.paymentType = @"1";
    order.inputCharset = @"utf-8";
    order.itBPay = @"30m";
     
    //应用注册scheme,在AlixPayDemo-Info.plist定义URL types
    NSString *appScheme = @"alisdkdemo";
        
    //将商品信息拼接成字符串
    NSString *orderSpec = [order description];
    NSLog(@"orderSpec = %@",orderSpec);
     
    //获取私钥并将商户信息签名,外部商户可以根据情况存放私钥和签名,只需要遵循RSA签名规范,并将签名字符串base64编码和UrlEncode
    id<DataSigner> signer = CreateRSADataSigner(privateKey);
    NSString *signedString = [signer signString:orderSpec];
        
    //将签名成功字符串格式化为订单字符串,请严格按照该格式
    NSString *orderString = nil;
    if (signedString != nil) {
       orderString = [NSString stringWithFormat:@"%@&sign="%@"&sign_type="%@"",
                           orderSpec, signedString, @"RSA"];
             
       [[AlipaySDK defaultService] payOrder:orderString fromScheme:appScheme callback:^(NSDictionary *resultDic) {
    //【callback处理支付结果】
                NSLog(@"reslut = %@",resultDic);
       }];
             
       [tableView deselectRowAtIndexPath:indexPath animated:YES];
    }

    详细可参见Demo中示例文件

    • AliSDKDemoAPViewController.h
    • AliSDKDemoAPViewController.m
    • AliSDKDemoOrder.h
    • AliSDKDemoOrder.m

    步骤5:调用支付宝

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    [[AlipaySDK defaultService] payOrder:orderString fromScheme:appScheme callback:^(NSDictionary *resultDic) {
                                NSLog(@"reslut = %@",resultDic);
                                if ([resultDic[@"resultStatus"] intValue]==9000) {
                                    //进入充值列表页面
                                    NSLog(@"支付成功");
                                }
                                else{
                                    NSString *resultMes = resultDic[@"memo"];
                                    resultMes = (resultMes.length<=0?@"支付失败":resultMes);
                                    NSLog(@"%@",resultMes);
                                }
        }];

    你可能会发现回调不行->设置回调shema

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    //上面支付时已经传给了支付宝客户端回调shema名称
     NSString *appScheme = URLScheme;
     //具体设置shema方法此处就不再累赘,这儿需要处理来自支付宝shema回调,才能完成上面方法的block回调
     在APPDelegate -
      - (BOOL)application:(UIApplication *)application
                openURL:(NSURL *)url
      sourceApplication:(NSString *)sourceApplication
             annotation:(id)annotation {
             //跳转支付宝钱包进行支付,处理支付结果
        [[AlipaySDK defaultService] processOrderWithPaymentResult:url standbyCallback:^(NSDictionary *resultDic) {
            NSLog(@"result = %@",resultDic);
        }];
        return YES;
    }
    二、银联支付UPPay
     
    银联sdk下载网址:https://open.unionpay.com/upload/download/Development_kit85427986.rar

    2.1 请去看银联文档和demo

    2.2 导入对应的库

    SDK说明

    SDK分为以下两个版本:

    ①    支持纯无卡交易静态库,以下简称UPPayPlugin,包含文件:

    1
    2
    3
    UPPayPlugin.h
    UPPayPluginDelegate.h
    libUPPayPlugin.a

    ②    支持纯无卡交易和VIPOS音频口支付静态库,以下简称UPPayPluginPro,包含文件:

    1
    2
    3
    UPPayPluginPro.h
    UPPayPluginDelegate.h
    libUPPayPluginPro.a

    大概这两个库就是上述那样(嗯,装懂了),具体问商务/后者后台,我们只需要知道

    ②需要将.m改成.mm (应该是用c++封装的音频...??)

    添加SDK包

    a)    根据商户选择的SDK版本,将sdk/inc目录和sdk/libs目录下对应版本的三个文件添加到UPPayDemo工程中;

    b)    如果你选择的是UPPayPlugin版本,添加QuartzCore.framework、Security.framework到工程中;

    c)    如果你选择的是UPPayPluginPro版本,添加QuartzCore.framework、AudioToolbox.framework, CoreAudio.framework、 MediaPlayer.framework, AVFoundation.framework和Security.framework到工程中;

    d)    在工程的Build Settings中找到Other Linker Flags中添加-ObjC宏;

    导入到工程

    2.3 对接

    1. 在需要调用支付控件的源文件内引用头文件 UPPayPlugin.h 或 UPPayPluginPro.h(注意:如果工程的 compile source as 选项的值不是 Objective–C++,则引用此头文件的文件类型都要改为.mm)

    2. 通过调用一下startPay方法

    1
    2
    3
    4
     + (BOOL)startPay:(NSString*)tn 
    mode:(NSString*)mode 
    viewController:(UIViewController*)viewController 
    delegate:(id)delegate;

    -------------2个参数说明(必填)-------------------

    1
    2
    3
    4
    tn                 NSString*                   交易流水号信息,银联后台生成,通过商户后台返回到客户端并传入支付控件; 
    mode            NSString*                 接入模式设定,两个值:@"00":代表接入生产环境(正式版本需要);@"01":代表接入开发测试环境(测试版本需要);
    viewController    UIViewController*          商户应用程序调用银联手机支付的当前UIViewController;
    delegate        id     实现UPPayPluginDelegate方法的UIViewController;

    嗯,这些都是文档中的,请仔细看看[上线的时候一定要修改mode模式]。

    mode在测试环境下,银联给的测试号 tn=@"01" 测试环境

    • 测试使用卡号、手机号信息(此类信息仅供测试,不会发生正式交易)招商银行预付费卡:

    • 银行卡号:6216261000000000018

    • 身份证号:341126197709218366

    • 手 机 号 :13552535506

    • 验 证 码 :123456 【要点击获取验证码,不然提交会报错】

    viewcontroller需要干这些事情

    *引入头文件  #import "UPPayPluginPro.h"
    *调用接口
            [UPPayPluginPro startPay:tn mode:self.tnMode viewController:self delegate:self];
    *实现对应代理方法
            #pragma mark UPPayPluginResult
            - (void)UPPayPluginResult:(NSString *)result
            {
                NSString* msg = [NSString stringWithFormat:@"%@", result];
                NSLog(@"msg%@",msg);
                if ([result isEqualToString:@"msgcancel"]) {
                    NSLog(@"取消银联支付...");
                }
                else if([result containsString:@"success"]){
                    NSLog(@"支付成功");
                }
          }

    三、微信支付

    微信sdk下载网址:https://pay.weixin.qq.com/wiki/doc/api/app.php?chapter=11_1

    3.1 请去看微信文档和demo

    微信支付工作之前的流程:https://open.weixin.qq.com/cgi-bin/showdocument?action=dir_list&t=resource/res_list&verify=1&id=open1419317780&token=ac5f0fd38fc8821171addbfdf5cc7d3af93cb305&lang=zh_CN

     微信支付文档地址:https://pay.weixin.qq.com/wiki/doc/api/app.php?chapter=8_1

    3.2 导入对应的库

        1.开发微信APP支付,需要先去微信开放平台申请移动应用,并开通微信支付功能,通过审核后方可进行开发;
        2.用XCode打开项目,【项目属性】-【Info】-【URL Schemes】设置微信开放平台申请的应用APPID,如图文件夹下"设置appid.jpg"所示。如果这的APPID设置不正确将无法调起微信支付;
        3.需要调用代码注册APPID:[WXApi registerApp:APP_ID withDescription:@"demo 2.0”];项目该APPID需与步骤2中APPID保持一致;
        4.支付请求:WXApiRequestHandler.m中的jumpToBizPay方法实现了唤起微信支付;
        5.支付完成回调:WXApiManager.m中的onResp方法中接收返回支付状态。

    希望各位多多指教。

     
     
  • 相关阅读:
    (一)Python入门-6面向对象编程:10特殊方法和运算符重载-特殊属性
    (一)Python入门-6面向对象编程:09多态
    (一)Python入门-6面向对象编程:08多重继承-mro()-super()获得父类的定义
    (一)Python入门-6面向对象编程:07面向对象三大特征(封装、继承、多态)-继承
    (一)Python入门-6面向对象编程:06私有属性和私有方法(实现封装)-@property装饰器-get和set方法-总结
    (一)Python入门-6面向对象编程:05方法没有重载-方法的动态性
    (一)Python入门-6面向对象编程:04__del__方法(析构函数)和垃圾回收机制-__call__方法和可调用对象
    python并发编程
    python学习笔记:第21天 常用内置模块之collections和time
    python学习笔记:第20天 多继承、MRO C3算法
  • 原文地址:https://www.cnblogs.com/linxiu-0925/p/5386041.html
Copyright © 2011-2022 走看看