iOS应用之 "Ping++" 支付集成

作者: 华之曦 | 来源:发表于2016-03-23 18:35 被阅读4599次

历经这么长时间,终于安下心来记录一下项目中Ping++支付的相关环节和内容,不得不说Ping++确实是一款很不错的三方支付平台,更重要的是方便快捷,简书App同样也运用了此三方平台。因为 Ping++官方给的接入指南 已经很详尽,所以这里就简单小结一下支付环节,附上项目中的部分代码。

1.导入SDK并添加相关设置

  • 当前项目中用的CocoaPods依赖管理工具来管理所需的第三方开源库(这样可以节省设置和更新第三方开源库的时间),导入 pod 'Pingpp', '~> 2.1.0' (默认会包含支付宝、微信、银联和百度钱包)。
  • 由于项目中需要用到微信支付所以要添加 URL Schemes:,填入在微信平台上注册的应用程序的id(以wx开头的字符串)。如下图:
    添加URL Types

2.接入开启支付的代码

  • 导入头文件

      #import "Pingpp.h"
    
  • 客户端从服务器获取 charge 对象

      /**
       *  确认支付订单,往服务器传递订单所需的参数,并返回charge对象
       */
      - (void)buyCarAddOrderDataWithCarid_count:(NSString *)carid_count {
       typeof(self) _weakSelf = self;
          NSString *userID = [[NSUserDefaults standardUserDefaults] objectForKey:@"user_id"];
          NSString *URL = [NSString stringWithFormat:@"%@/App/Sylm/yclist",SERVERURL];
          NSMutableDictionary *paramas = [NSMutableDictionary dictionary];
          paramas[@"method"] = @"addorder";
          paramas[@"buy_status"] = _buy_status;
          paramas[@"carid_count"] = carid_count;
          paramas[@"user_id"] = userID;
          paramas[@"ways"] = self.ways; //客户端选择的支付方式参数
          paramas[@"addr_id"] = self.addressModel.address_id;
          [HXHttpTool post:URL params:paramas success:^(id json) {
              LXLog(@"%@", json);
              // 返回的json就是charge对象,直接拿来用,传递给调用唤起支付的方法             
              [_weakSelf wakeUpPingWithCharge:json];
          } failure:^(NSError *error) {
              [SVProgressHUD showErrorWithStatus:@"调取支付失败" maskType:SVProgressHUDMaskTypeGradient];
              LXLog(@"%@", error);
          }];
      }
    

另:附上接口对照参数(仅供参考):

接口参数
  • 利用charge对象唤起相应支付,其中kURLScheme为本应用的URL Schemes,在支付成功之后,正常跳转回应用。

      /**
       *  利用charge对象唤起支付
       */
      - (void)wakeUpPingWithCharge:(NSString *)charge {
           typeof(self) _weakSelf = self;
           [Pingpp createPayment:charge
                  viewController:self
                  appURLScheme:kURLScheme
                  withCompletion:^(NSString *result, PingppError *error) {
                     if ([result isEqualToString:@"success"]) {
                      // 支付成功
                      [SVProgressHUD showSuccessWithStatus:@"支付成功" maskType:SVProgressHUDMaskTypeGradient];
                      // 这个方法在模拟器上运行支付时会走,真机测试时,这个方法不会触发,没有真机时,进行页面跳转调的方法
                      //[_weakSelf gotoSuccessVC];
                  } else {
                      // 支付失败或取消
                      LXLog(@"Error: code=%lu msg=%@", error.code, [error getMsg]);
                         [SVProgressHUD showErrorWithStatus:@"取消支付" maskType:SVProgressHUDMaskTypeGradient];
                     }
            }];
      }
    

配置 kURLScheme,如下图:


应用Schemes
  • 接收并处理支付结果,必须实现

AppDelegate.m文件中实现支付结果回调的方法,这里只做ios9以上的了。

    iOS 9 及以上

    - (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<NSString *,id> *)options {
        [Pingpp handleOpenURL:url withCompletion:^(NSString *result, PingppError *error) {
            LXLog(@"%@", result);
            // 用通知实现支付成功的页面跳转
            if ([result isEqualToString:@"success"]) {
              [[NSNotificationCenter defaultCenter] postNotificationName:@"enterSuccessView" object:nil];
         }
        }];
    return YES;
    }

3.小结

  • Ping++把支付订单的环节都放在服务器,所以客户端做的处理就少了许多,而且安全性更高(官方Demo用Swift写的),赞。
  • 用微信支付的时候,要用真机进行测试,且安装的有微信客户端
  • iOS9限制http协议的访问,需要在info.plist文件中添加访问权限,而且还要添加应用白名单,如下图:


    添加网络访问权限及白名单

相关文章

网友评论

  • 徐老茂:请问我配置了微信和支付宝的Scheme,然后那个kURLScheme该怎么设置呢?
  • 3e9d42c1081a:ping++我看要收费呀
    华之曦:@hanhan0723 我们这边是提交银行卡信息到后台,再处理的。
    3e9d42c1081a:提现的有搞过吗
    华之曦:@hanhan0723 都是套路吧,大不了单独集成呗。
  • 6850ae5f4d68:楼主 能发个demo出来吗? 真的急需 337423587@qq.com 万分感谢
    华之曦:@徐进进 就上面那两三块代码的,再配置一下就可以的。
  • 坦白从宽是犯罪:虽然不是同一个支付但是楼主的代码给了我提示,解决了我的问题, 谢谢了
    华之曦: @坦白从宽是犯罪 不谢,相互帮助。😁
  • MyiOS:那支付宝公钥秘钥在ping++的哪里设置?
  • Roys:楼主,为什么我照着写了,在真机上也没有跳到微信去呢
    华之曦:@Roys 检查一下是否有后台返回的"charge对象"?
  • 四月天__:P++支付是不是要交钱啊楼主
    华之曦: @天涯长风 你还没有注册用了吧!
    四月天__:@Huazhixi 我看官方说的,申请支付渠道的时候一个渠道是399是怎么回事呢
    华之曦:@天涯长风 目前是免费。
  • 丶狂舞:楼主,支付成功以后,跳转到成功界面在哪写,我现在只能返回发起支付的那个界面
    华之曦: @丶狂舞 嗯,是的呀,在Delegate里面要写支付回调,然后发送通知的了。
    丶狂舞:@Huazhixi 我之前只跳回了发起支付的界面,写了个通知才搞定,总之,多谢了 :smile:
    华之曦:@丶狂舞 成功的界面是要自己写呀,你们应该有效果图的吧。
    支付成功之后,返回当前应用,然后进行相应成功页面跳转。
  • xzm_prefect:请问楼主向service传递的参数具体都是什么意思,代表什么
    华之曦:@xzm_prefect 已经附上了,接口参数图,不过这只是我们后台给的接口方式。

本文标题:iOS应用之 "Ping++" 支付集成

本文链接:https://www.haomeiwen.com/subject/ivgllttx.html