所有信息的生成都在前端完成,包括对订单进行sign签名以及MD5签名加密(此方法相对来说有些复杂,没有官方给的方法简单)。
注:官方给的是v3&v4支付流程,签名和加密都是在服务器端进行,由于没有对接过,所以就暂时没有办法分享。

1. 准备工作

  • 微信支付所需的相关用户信息(由用户申请)
  1. //微信支付商户号
  2. #define MCH_ID @"YOUR_MCH_ID"
  3. //开户邮件中的(公众账号APPID或者应用APPID)
  4. #define WX_AppID @"YOUR_WX_AppID"
  5. //安全校验码(MD5)密钥,商户平台登录账户和密码登录http://pay.weixin.qq.com 平台设置的“API密钥”,为了安全,请设置为以数字和字母组成的32字符串。
  6. #define WX_PartnerKey @"YOUR_WX_PartnerKey"
  7. //获取用户openid,可使用APPID对应的公众平台登录http://mp.weixin.qq.com 的开发者中心获取AppSecret。
  8. #define WX_AppSecret @"YOUR_WX_AppSecret"

2. 集成开发流程

1 . iOS 9系统策略更新,限制了http协议的访问,此外应用需要在“Info.plist”中将要使用的URL Schemes(跳转程序)列为白名单,才可正常检查其他应用是否安装(引自微信支付SDK1.6.2Readme.text)。如下图:

注:LSApplicationQueriesSchemes 下面其他的为友盟分享要添加的白名单,当然也包含微信。

ios9之后让应用可以支持http请求

bitcode配置

2 . 在项目属性中的URL Types中添加URL Schemes,如图中标红位置所示。

3 . 在项目工程Appdelegate.m文件里面添加注册微信支付信息,注:如果项目中第三方分享用的是友盟,在注册的时候要把友盟注册放在微信注册的前面执行。如下:

  1. #pragma mark - 设置第三方 注册信息
  2. - (void)registerMethods {
  3. /**************** 友盟分享注册信息 *****************/
  4. [UMSocialData setAppKey:UMSocial_AppKey];
  5.  
  6. //设置微信AppId、appSecret,分享url
  7. [UMSocialWechatHandler setWXAppId:WX_appID appSecret:WX_AppSecret url:@"http://www.umeng.com/social"];
  8.  
  9. //设置手机QQ 的AppId,Appkey,和分享URL
  10. [UMSocialQQHandler setQQWithAppId:QQ_AppID appKey:QQ_AppKey url:@"http://www.umeng.com/social"];
  11. [UMSocialConfig hiddenNotInstallPlatforms:@[UMShareToQQ, UMShareToQzone, UMShareToWechatTimeline, UMShareToWechatTimeline]];
  12.  
  13. //打开新浪微博的SSO开关,设置新浪微博回调地址,这里必须要和你在新浪微博后台设置的回调地址一致。
  14. // 添加SSO授权开关(使用微博原生SDK)
  15. [UMSocialSinaSSOHandler openNewSinaSSOWithAppKey:Sina_AppKey RedirectURL:@"http://sns.whalecloud.com/sina2/callback"];
  16. // 添加SSO授权开关(非微博原生SDK)
  17. [UMSocialSinaHandler openSSOWithRedirectURL:@"http://sns.whalecloud.com/sina2/callback"];
  18. /**************** 友盟分享注册信息 *****************/
  19.  
  20. // 先调用友盟,然后调用微信清册信息
  21. /**************** 注册微信支付信息 *****************/
  22. [WXApi registerApp:WX_appID];
  23. // [WXApi registerApp:WX_appID withDescription:@"demo 2.0"];
  24. 两个任选一行,还不清楚这个appdesc有何作用
  25. }

4.配置DataMD5.m文件,本地对签名进行二次加密,如果忽略这个步骤,就会造成调起微信支付,只出现一个确定按钮。

5 . 在要唤起微信支付的.m文件中,直接上代码方便ctrl+c, ctrl+v

  1. #pragma mark - 微信支付相关方法
  2. - (void)weixinChooseAct {
  3. NSString *appid,*mch_id,*nonce_str,*sign,*body,*out_trade_no,*total_fee,*spbill_create_ip,*notify_url,*trade_type,*partner;
  4. //应用APPID
  5. appid = WX_appID;
  6. //微信支付商户号
  7. mch_id = MCH_ID;
  8. //产生随机字符串,这里最好使用和安卓端一致的生成逻辑
  9. nonce_str =[self generateTradeNO];
  10. body =@"微信支付时候看到的支付信息";
  11. //随机产生订单号用于测试,正式使用请换成你从自己服务器获取的订单号
  12. out_trade_no = self.gold_sn;
  13. //交易价格1表示0.01元,10表示0.1元
  14. total_fee = self.payCount;
  15. //获取本机IP地址,请再wifi环境下测试,否则获取的ip地址为error,正确格式应该是8.8.8.8
  16. spbill_create_ip =[getIPhoneIP getIPAddress];
  17. //交易结果通知网站此处用于测试,随意填写,正式使用时填写正确网站
  18. notify_url =@"www.cccuu.com";
  19. trade_type =@"APP";
  20. //商户密钥
  21. partner = WX_partnerKey;
  22. //获取sign签名
  23. DataMD5 *data = [[DataMD5 alloc] initWithAppid:appid mch_id:mch_id nonce_str:nonce_str partner_id:partner body:body out_trade_no:out_trade_no total_fee:total_fee spbill_create_ip:spbill_create_ip notify_url:notify_url trade_type:trade_type];
  24. sign = [data getSignForMD5];
  25. //设置参数并转化成xml格式
  26. NSMutableDictionary *dic = [NSMutableDictionary dictionary];
  27. [dic setValue:appid forKey:@"appid"];//公众账号ID
  28. [dic setValue:mch_id forKey:@"mch_id"];//商户号
  29. [dic setValue:nonce_str forKey:@"nonce_str"];//随机字符串
  30. [dic setValue:sign forKey:@"sign"];//签名
  31. [dic setValue:body forKey:@"body"];//商品描述
  32. [dic setValue:out_trade_no forKey:@"out_trade_no"];//订单号
  33. [dic setValue:total_fee forKey:@"total_fee"];//金额
  34. [dic setValue:spbill_create_ip forKey:@"spbill_create_ip"];//终端IP
  35. [dic setValue:notify_url forKey:@"notify_url"];//通知地址
  36. [dic setValue:trade_type forKey:@"trade_type"];//交易类型
  37. // 转换成xml字符串
  38. NSString *string = [dic XMLString];
  39. [self http:string];
  40. }
  41.  
  42. #pragma mark - 拿到转换好的xml发送请求
  43. - (void)http:(NSString *)xml {
  44. [MBProgressHUD showMessage:@"正在获取支付订单..."];
  45. AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
  46. //这里传入的xml字符串只是形似xml,但是不是正确是xml格式,需要使用af方法进行转义
  47. manager.responseSerializer = [[AFHTTPResponseSerializer alloc] init];
  48. [manager.requestSerializer setValue:@"text/xml; charset=utf-8" forHTTPHeaderField:@"Content-Type"];
  49. [manager.requestSerializer setValue:@"https://api.mch.weixin.qq.com/pay/unifiedorder" forHTTPHeaderField:@"SOAPAction"];
  50. [manager.requestSerializer setQueryStringSerializationWithBlock:^NSString *(NSURLRequest *request, NSDictionary *parameters, NSError *__autoreleasing *error) {
  51. return xml;
  52. }];
  53. //发起请求
  54. [manager POST:@"https://api.mch.weixin.qq.com/pay/unifiedorder" parameters:xml success:^(AFHTTPRequestOperation *operation, id responseObject) {
  55. NSString *responseString = [[NSString alloc] initWithData:responseObject encoding:NSUTF8StringEncoding] ;
  56. // LXLog(@"responseString is %@",responseString);
  57. //将微信返回的xml数据解析转义成字典
  58. NSDictionary *dic = [NSDictionary dictionaryWithXMLString:responseString];
  59. //判断返回的许可
  60. if ([[dic objectForKey:@"result_code"] isEqualToString:@"SUCCESS"] &&[[dic objectForKey:@"return_code"] isEqualToString:@"SUCCESS"] ) {
  61. //发起微信支付,设置参数
  62. PayReq *request = [[PayReq alloc] init];
  63. request.openID = [dic objectForKey:@"appid"];
  64. request.partnerId = [dic objectForKey:@"mch_id"];
  65. request.prepayId= [dic objectForKey:@"prepay_id"];
  66. request.package = @"Sign=WXPay";
  67. request.nonceStr= [dic objectForKey:@"nonce_str"];
  68. //将当前事件转化成时间戳
  69. NSDate *datenow = [NSDate date];
  70. NSString *timeSp = [NSString stringWithFormat:@"%ld", (long)[datenow timeIntervalSince1970]];
  71. UInt32 timeStamp =[timeSp intValue];
  72. request.timeStamp= timeStamp;
  73. // 签名加密
  74. DataMD5 *md5 = [[DataMD5 alloc] init];
  75. request.sign=[md5 createMD5SingForPay:request.openID partnerid:request.partnerId prepayid:request.prepayId package:request.package noncestr:request.nonceStr timestamp:request.timeStamp];
  76. // 调用微信
  77. [WXApi sendReq:request];
  78. [MBProgressHUD hideHUD];
  79. }else{
  80. LXLog(@"参数不正确,请检查参数");
  81. [MBProgressHUD hideHUD];
  82. [MBProgressHUD showError:@"支付错误!"];
  83. }
  84. } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
  85. LXLog(@"error is %@",error);
  86. [MBProgressHUD hideHUD];
  87. [MBProgressHUD showError:@"未完成支付"];
  88. }];
  89. }
  90.  
  91. #pragma mark - 产生随机订单号
  92. - (NSString *)generateTradeNO {
  93. static int kNumber = ;
  94.  
  95. NSString *sourceStr = @"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
  96. NSMutableString *resultStr = [[NSMutableString alloc] init];
  97. srand(time()); // 此行代码有警告:
  98. for (int i = ; i < kNumber; i++) {
  99. unsigned index = rand() % [sourceStr length];
  100. NSString *oneStr = [sourceStr substringWithRange:NSMakeRange(index, )];
  101. [resultStr appendString:oneStr];
  102. }
  103. return resultStr;
  104. }

注:上面 stand(time(0));报警告,如下图:

改为 srand( (unsigned)time(0) );

6 . 最后在Appdelegate.m文件中添加微信支付结果 onResp 回调方法,非常重要:给后台发送数据进行后台数据的更新(例如:充值浩方Vip会员,微信钱包钱已经扣了,而后台没有收到信息,钱不就白花了 - - 、),如下:

  1. #pragma mark - WXApiDelegate
  2. -(void)onResp:(BaseResp *)resp {
  3. if ([resp isKindOfClass:[PayResp class]]) {
  4. PayResp*response=(PayResp*)resp; // 微信终端返回给第三方的关于支付结果的结构体
  5. switch (response.errCode) {
  6. case WXSuccess:
  7. {// 支付成功,向后台发送消息
  8. LXLog(@"支付成功");
  9. [[NSNotificationCenter defaultCenter] postNotificationName:@"WX_PaySuccess" object:nil];
  10. }
  11. break;
  12. case WXErrCodeCommon:
  13. { //签名错误、未注册APPID、项目设置APPID不正确、注册的APPID与设置的不匹配、其他异常等
  14. [MBProgressHUD showError:@"支付失败"];
  15. LXLog(@"支付失败");
  16. }
  17. break;
  18. case WXErrCodeUserCancel:
  19. { //用户点击取消并返回
  20. LXLog(@"取消支付");
  21. [MBProgressHUD showError:@"取消支付"];
  22. }
  23. break;
  24. case WXErrCodeSentFail:
  25. { //发送失败
  26. LXLog(@"发送失败");
  27. [MBProgressHUD showError:@"发送失败"];
  28. }
  29. break;
  30. case WXErrCodeUnsupport:
  31. { //微信不支持
  32. LXLog(@"微信不支持");
  33. [MBProgressHUD showError:@"微信不支持"];
  34. }
  35. break;
  36. case WXErrCodeAuthDeny:
  37. { //授权失败
  38. LXLog(@"授权失败");
  39. [MBProgressHUD showError:@"授权失败"];
  40. }
  41. break;
  42. default:
  43. break;
  44. }
  45. }
  46. }

到此结束,忘能正常唤起微信支付。

转载自:http://www.jianshu.com/p/94dcc220b2aa

在AppDelegate.m中介绍微信支付成功和失败的回调,成功的时候通过通知的方式在相应的页面完成接下来的工作。

 

iOS应用之微信支付集成-直接前端集成的更多相关文章

  1. js 生成32位随机数,可用于微信支付流水号(前端生成)

    $(function () { /*生成32位随机流水号*/ /*默认去掉了容易混淆的字符oOLl,9gq,Vv,Uu,I1*/ var $chars = 'ABCDEFGHJKMNPQRSTWXYZ ...

  2. 微信支付(APP)集成时碰到的问题(.net提示“无权限”、iOS跳转到微信支付页面中间只有一个“确定”按钮)

    直入主题之前,请容我吐槽一下微*的官方东西:ASDFQ%#$%$#$%^FG@#$%DSFQ#$%.......:吐槽玩了!大家心照就好. 要完成手机APP跳转到微信的APP进行微信支付,需要进行如下 ...

  3. 【第十二篇】微信支付(APP)集成时碰到的问题(.net提示“无权限”、iOS跳转到微信支付页面中间只有一个“确定”按钮)(转)

    直入主题之前,请容我吐槽一下微*的官方东西:ASDFQ%#$%$#$%^FG@#$%DSFQ#$%.......:吐槽玩了!大家心照就好. 要完成手机APP跳转到微信的APP进行微信支付,需要进行如下 ...

  4. iOS中 最新微信支付/最全的微信支付教程详解 韩俊强的博客

    每日更新关注:http://weibo.com/hanjunqiang  新浪微博! 亲们, 首先让我们来看一下微信支付的流程吧. 1. 注册微信开放平台,创建应用获取appid,appSecret, ...

  5. iOS中 最新微信支付/最全的微信支付教程具体解释 韩俊强的博客

    亲们, 首先让我们来看一下微信支付的流程吧. 1. 注冊微信开放平台,创建应用获取appid,appSecret,申请支付功能,申请成功之后会返回一些參数. 2. 下载微信支付sdk 3. clien ...

  6. 李洪强iOS开发支付集成之微信支付

    iOS开发支付集成之微信支付 微信支付也是需要签名的,也跟支付宝一样,可以在客户端签名,也可以在后台签名(当然,为了安全还是推荐在服务器上做签名,逻辑也比较好理解). 1 - 集成前首先要看看文档 开 ...

  7. Android 支付宝以及微信支付快速接入流程

    简介 随着移动支付的普及,越来越多的App采用第三发支付,在这里我们以支付宝为例,做一个快速集成! 一.Android快速实现支付宝支付 1.首先,我们需要前往支付宝开放平台,申请我们的支付功能:ht ...

  8. Android开发——支付宝和微信支付快速接入流程

    一.Android快速实现支付宝支付 1.首先,我们需要前往支付宝开放平台,申请我们的支付功能:https://open.alipay.com/platform/home.htm 支付宝首页 这里 有 ...

  9. 简聊iOS支付集成(支付宝和微信支付)

    一.支付集成是什么 1.现在大部分app都有快捷支付功能,支付集成将第三方支付平台集成到自己的项目中,能够完成自己项目中的支付功能, 二.支付集成的使用 <1>.支付宝: 下载SDK和De ...

随机推荐

  1. Oracle调整联机日志大小

    近期一个项目反馈月底高峰期时系统整体性能下降,抓取对应的AWR和ASH查看,等待事件排第一位的竟然是redo日志切换.进一步看每秒的日志量是5M多,而日志文件大小仅有200M.建议项目上调整日志大小, ...

  2. windows ftp 连接serv_U 管理员

    连接工具名称:8uftp 小技巧:活动模式连接

  3. SQL Server:排名函数row_number,rank,dense_rank,ntile详解

    1.Row_Number函数 row_number函数大家比较熟悉一些,因为它的用途非常的广泛,我们经常在分页与排序中用到它,它的功能就是在每一行中生成一个连续的不重复的序号 例如: select S ...

  4. 文件hash数据库

    unit YxdDB; interface uses Windows, Classes, SysUtils, SyncObjs; type TYXDDBValue = packed record Si ...

  5. fastboot 重启到recovery

    要使用adb命令,手机需要打开USB debug. 安装软件 adb install apk文件名称.apk 重新安装该软件 adb install -r apk文件名称.apk 卸载apk软件 ad ...

  6. (C# Binary Tree) 基本概念和算法

    A binary tree is defined as a tree where each node can have no more than two children. Building a Bi ...

  7. SQL Server 2008 数据库镜像部署实例之一 数据库准备

    SQL Server 2008 数据库镜像部署实例之一 数据库准备 一.目标 利用Sql Server 2008 enterprise X64,建立异步(高性能)镜像数据库,同时建立见证服务器实现自动 ...

  8. 用wamp配置的环境,想用CMD连接mysql怎么连

    签:用wamp配置的环境   想用cmd连接mysql怎么连 进到d盘该目录     (cd切不了盘,就输入盘符加冒号回车,再cd到目录) WAMP装好后,mysql数据库运行时没有 mysql 和 ...

  9. 2014年第五届蓝桥杯C/C++程序设计本科B组决赛

    1.年龄巧合(枚举) 2.出栈次序(推公式/Catalan数) 3.信号匹配(kmp) 4.生物芯片(完全平方数) 5.Log大侠(线段树) 6.殖民地 1.年龄巧合 小明和他的表弟一起去看电影,有人 ...

  10. Navicat链接Oracle提示ORA-12737

    ORA-12737: Instant Client Light: unsupported server character set string Cause: The character set sp ...