iOS 微信和支付宝的最新整理(客户端和后台两种demo)

2017 年 8 月 11 日 CocoaChina JoanKing

一.微信支付


前提:在微信开发者平台注册APP这样的事一般的是经理给你做好的,这个可以忽略,如果需要做的话,可以参考别人的这篇文章,微信支付没有想象的那么困难,下面我会写两种:一种在客户端(app)完成,一种在后台完成



微信的支付交互图


微信的支付交互图


  • 2.先要理清楚支付的流程(下面的过程虽然复杂但是支付时很简单,稍后会采用客户端后台的两种方式去讲解,也会有demo展示):


  • 1.用户使用APP客户端,选择商品下单。


  • 2.商户客户端(就是你做的APP)将用户的商品数据传给商户服务器,请求生成支付订单。


  • 3.商户后台调用统一下单API向微信的服务器发送请求,微信服务器生成预付单,并生成一个prepay_id返回给商户后台。


  • 4.商户后台将这个prepay_id返回给商户客户端。


  • 5.用户点击确认支付,这时候商户客户端调用SDK打开微信客户端,进行微信支付。


  • 6.微信客户端向微信服务器发起支付请求并返回支付结果(他们之间交互用的就是prepay_id这个参数,微信的服务器要验证微信客户端传过去的参数是否跟第三步中生成的那个id一致)。


  • 7.用户输入支付密码后,微信客户端提交支付授权,跟微信服务器交互,完成支付


  • 8.微信服务器给微信客户端发送支付结果提示,并异步给商户服务器发送支付结果通知。


  • 9.商户客户端通过支付结果回调接口查询支付结果,并向后台检查支付结 果是否正确,后台返回支付结果。


  • 10.商户客户端显示支付结果,完成订单,发货。


  • 3.客户端需要做的是调用支付,显示支付结果


客户端需要做的是调用支付,显示支付结果


  • 4.下面开始讲解集成微信支付


  • 1.先对微信SDK的下载拖进工程


微信SDK的下载


  • 2.导入微信支付SDK库


在Target —> BuildPhases —> Link Binary With Libraries— 点击+号 -> 搜索你需要的系统库。


  • SystemConfiguration.framework

  • libz.tbd

  • libsqlite3.0.tbd

  • CoreTelephony.framework

  • QuartzCore.framework


导入微信支付SDK库


  • 3.导入WechatTool


导入WechatTool


  • 4.设置URL Scheme


设置URL Scheme


  • 5.在Appdelegate中注册APPID


 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {


    [WXApi registerApp:MXWechatAPPID];


    return YES;

 }


// NOTE: 9.0以后使用新API接口

- (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<NSString*, id> *)options

{

      if ([url.host isEqualToString:@"safepay"]) {


          NSLog(@"这里做支付宝的操作");


      }else{


        return  [WXApi handleOpenURL:url delegate:[JKApiManager sharedManager]];


      }

    return YES;

}


#pragma mark - 微信支付回调

- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url

{

    return [WXApi handleOpenURL:url delegate:[JKApiManager sharedManager]];

}


  • 6.在使用的地方调用(你需要把一些参数传进去6个)


  • 调用微信支付前,需要下单、签名等操作,以便获取微信支付所必要的参数。为了提高安全性,下单、签名操作一般是在后台完成,在前台做的话被捕获改信息就不开心了。。。。。



  • JKWechatPayHandler类里面需要的参数包括:appid、partid(商户号)、prepayid(预支付订单ID)、noncestr(参与签名的随机字符串)、timestamp(参与签名的时间戳)、sign(签名字符串)这六个。


//发起微信支付


[JKWechatPayHandler jumpToWxPay];


  • 7.下面开始讲解后台来做操作给我们生成上面的六个参数以及新的调用


  • 1.遵守协议WXApiDelegate


  • 2.在AppDelegate里面调用


- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {


    [WXApi registerApp:MXWechatAPPID];


    return YES;

}


// NOTE: 9.0以后使用新API接口

- (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<NSString*, id> *)options

{

     if ([url.host isEqualToString:@"safepay"]) {


           NSLog(@"这里做支付宝的操作");


 }else{


   /*

    *  后台生成六个参数调用时

    */

    // return  [WXApi handleOpenURL:url delegate:self];

   /*

    *  app自己生成六个参数调用时

    */

   return  [WXApi handleOpenURL:url delegate:self];


    }

   return YES;

 }


#pragma mark - 微信支付回调


- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url

{

   /*

    *  后台生成六个参数调用时

    */

    // return  [WXApi handleOpenURL:url delegate:self];

    /*

     *  app自己生成六个参数调用时

     */

    return  [WXApi handleOpenURL:url delegate: self];

  }

 //微信SDK自带的方法,处理从微信客户端完成操作后返回程序之后的回调方法,显示支付结果的

 -(void) onResp:(BaseResp*)resp

 {

     //启动微信支付的response

     NSString *payResoult = [NSString stringWithFormat:@"errcode:%d", resp.errCode];


     if([resp isKindOfClass:[PayResp class]]){

     //支付返回结果,实际支付结果需要去微信服务器端查询

      switch (resp.errCode) {

          case 0:

             payResoult = @"JK支付结果:成功!";

             NSLog(@"%@",payResoult);

          break;

          case -1:

             payResoult = @"JK支付结果:失败!";

             NSLog(@"%@",payResoult);

          break;

          case -2:

            payResoult = @"JK用户已经退出支付!";

            NSLog(@"%@",payResoult);

         break;

        default:

           payResoult = [NSString stringWithFormat:@"JK支付结果:失败!retcode = %d, retstr = %@", resp.errCode,resp.errStr];

           NSLog(@"%@",payResoult);

         break;

       }

    }

}



  • 3.在使用时调用


/*

 *  自己写的支付

 */

 - (void)WXPay{


 在这里把价格和商品的信息发送给服务器,服务器会生成上面的6个参数(我们后台生成的是一个字典,里面是6个键值,对应的是6个参数值)在此调用下面的方法传到下面去


 }


 -(void)payDictionary:(NSDictionary *)dict{


   //需要创建这个支付对象

      PayReq *req   = [[PayReq alloc] init];

   //由用户微信号和AppID组成的唯一标识,用于校验微信用户

      req.openID = [NSString stringWithFormat:@"%@",dict[@"appid"]];


   // 商家id,在注册的时候给的

      req.partnerId = [NSString stringWithFormat:@"%@",dict[@"partnerid"]];


   // 预支付订单这个是后台跟微信服务器交互后,微信服务器传给你们服务器的,你们服务器再传给你

      req.prepayId  = [NSString stringWithFormat:@"%@",dict[@"prepayid"]];


   // 根据财付通文档填写的数据和签名

   //这个比较特殊,是固定的,只能是即req.package = Sign=WXPay

      req.package = @"Sign=WXPay";


   // 随机编码,为了防止重复的,在后台生成

      req.nonceStr  = [NSString stringWithFormat:@"%@",dict[@"noncestr"]];


   // 这个是时间戳,也是在后台生成的,为了验证支付的

       NSString * stamp = [NSString stringWithFormat:@"%@",dict[@"timestamp"]];

       req.timeStamp = stamp.intValue;


   // 这个签名也是后台做的

      req.sign = [NSString stringWithFormat:@"%@",dict[@"sign"]];


   //发送请求到微信,等待微信返回onResp

   [WXApi sendReq:req];


  }


  • 4.支付成功与否在AppDelegate里面会有微信的回调可以看出支付成功还是失败


  • 5.下面奉上两个demo,里面有运行调试的说明,在图片里面有说明

微信的两种支付方式demo 密码: tp8q


  • 6.你可能遇到的问题


  • 1.如果支付完成后,一直留在微信,那就检查下URLType中的Scheme设置问题。


  • 2.能够打开微信客户端,但是打开后只有中间一个白色的 “确定按钮”,点击后会回到客户端上,如果是这样,那应该是prepayid 参数的问题,过期了,或者不是真实的id。代码没有问题的。特别注意的是,微信要两次签名


  • 3.微信支付的单位是分


  • 4.如果APP里面使用了友盟或者ShareSDK做分享,那就不用再导入SDK了,否则会出现一些诡异的问题,例如无法调起手机微信客户端、无法调起微信客户端web页面,调起了但是一闪而过。。。这都基本上都是因为分享的SDK里面已经包括了微信的SDK。所以如果出现诡异的错误了看看是不是两个冲突了!


二.支付宝支付



  • 2.于此同时奉上支付宝的两个demo,一个是客户端(app做操作的),一个是后台对订单加密签约等等做操作的,不懂得可以加群群号:584599353或者私信我一起交流成长


客户端和后台的两种操作的demo 密码: djgu


作者:JoanKing

链接:http://www.jianshu.com/p/b73be8ce1616

來源:简书

著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。


CC

壹周精选

Weekly Selection

今日头条:819CVP系列开发者沙龙将在月球上举行

iOS 通俗易懂的HTTP网络

iOS 工程自动化 - OCLint

从简书iOS客户端,来谈谈Hybrid方案细节设计

懒人做iOS系列之jenkins+git+fir打包

TIOBE 8 月编程语言排行榜:“后院”硝烟四起

如何成为一个高逼格的程序员指南


CocoaChina

全球最大苹果开发中文社区


登录查看更多
0

相关内容

【2020新书】实战R语言4,323页pdf
专知会员服务
98+阅读 · 2020年7月1日
【实用书】Python爬虫Web抓取数据,第二版,306页pdf
专知会员服务
115+阅读 · 2020年5月10日
【干货】用BRET进行多标签文本分类(附代码)
专知会员服务
84+阅读 · 2019年12月27日
【干货】大数据入门指南:Hadoop、Hive、Spark、 Storm等
专知会员服务
94+阅读 · 2019年12月4日
Keras作者François Chollet推荐的开源图像搜索引擎项目Sis
专知会员服务
29+阅读 · 2019年10月17日
MIT新书《强化学习与最优控制》
专知会员服务
270+阅读 · 2019年10月9日
PC微信逆向:两种姿势教你解密数据库文件
黑客技术与网络安全
16+阅读 · 2019年8月30日
用Now轻松部署无服务器Node应用程序
前端之巅
16+阅读 · 2019年6月19日
PHP使用Redis实现订阅发布与批量发送短信
安全优佳
7+阅读 · 2019年5月5日
已删除
架构文摘
3+阅读 · 2019年4月17日
从webview到flutter:详解iOS中的Web开发
前端之巅
5+阅读 · 2019年3月24日
I2P - 适用于黑客的Android应用程序
黑白之道
28+阅读 · 2019年3月6日
C# 10分钟完成百度人脸识别
DotNet
3+阅读 · 2019年2月17日
用Python调用百度OCR接口实例
数据挖掘入门与实战
16+阅读 · 2018年1月29日
Neo4j 和图数据库起步
Linux中国
8+阅读 · 2017年12月20日
Arxiv
14+阅读 · 2019年11月26日
Arxiv
5+阅读 · 2018年5月1日
Arxiv
3+阅读 · 2018年3月29日
Arxiv
6+阅读 · 2018年2月7日
Arxiv
7+阅读 · 2017年12月28日
VIP会员
相关VIP内容
【2020新书】实战R语言4,323页pdf
专知会员服务
98+阅读 · 2020年7月1日
【实用书】Python爬虫Web抓取数据,第二版,306页pdf
专知会员服务
115+阅读 · 2020年5月10日
【干货】用BRET进行多标签文本分类(附代码)
专知会员服务
84+阅读 · 2019年12月27日
【干货】大数据入门指南:Hadoop、Hive、Spark、 Storm等
专知会员服务
94+阅读 · 2019年12月4日
Keras作者François Chollet推荐的开源图像搜索引擎项目Sis
专知会员服务
29+阅读 · 2019年10月17日
MIT新书《强化学习与最优控制》
专知会员服务
270+阅读 · 2019年10月9日
相关资讯
PC微信逆向:两种姿势教你解密数据库文件
黑客技术与网络安全
16+阅读 · 2019年8月30日
用Now轻松部署无服务器Node应用程序
前端之巅
16+阅读 · 2019年6月19日
PHP使用Redis实现订阅发布与批量发送短信
安全优佳
7+阅读 · 2019年5月5日
已删除
架构文摘
3+阅读 · 2019年4月17日
从webview到flutter:详解iOS中的Web开发
前端之巅
5+阅读 · 2019年3月24日
I2P - 适用于黑客的Android应用程序
黑白之道
28+阅读 · 2019年3月6日
C# 10分钟完成百度人脸识别
DotNet
3+阅读 · 2019年2月17日
用Python调用百度OCR接口实例
数据挖掘入门与实战
16+阅读 · 2018年1月29日
Neo4j 和图数据库起步
Linux中国
8+阅读 · 2017年12月20日
Top
微信扫码咨询专知VIP会员