iOS集成微信支付开发

本文实例为大家分享了iOS集成微信支付开发代码,供大家参考,具体内容如下

首先需要理清楚流程:

1、用户使用APP客户端,选择商品下单。
2、商户客户端(就是你做的APP)将用户的商品数据传给商户服务器,请求生成支付订单。
3、商户后台调用统一下单API向微信的服务器发送请求,微信服务器生成预付单,并生成一个prepay_id返回给商户后台。
4、商户后台将这个prepay_id返回给商户客户端。
5、用户点击确认支付,这时候商户客户端调用SDK打开微信客户端,进行微信支付。
6、微信客户端向微信服务器发起支付请求并返回支付结果(他们之间交互用的就是prepay_id这个参数,微信的服务器要验证微信客户端传过去的参数是否跟第三步中生成的那个id一致)。
7、用户输入支付密码后,微信客户端提交支付授权,跟微信服务器交互,完成支付
8、微信服务器给微信客户端发送支付结果提示,并异步给商户服务器发送支付结果通知。
9、商户客户端通过支付结果回调接口查询支付结果,并向后台检查支付结果是否正确,后台返回支付结果。
10、商户客户端显示支付结果,完成订单,发货。

虽然看起来有点多,但是理解起来并不复杂,跟我们平时手机上买东西是一样的。我们客户端需要做的就是

调起微信客户端发起支付
显示支付结果

集成过程

首先是要下载SDK

微信SDK下载

建议头文件和示例都下载出来看看。(吐槽下,官方的示例难看死了,看的眼晕!注释都没几个。。。鄙视之)

导入微信支付SDK库

导入上面那个iOS头文件和库下载下载出来的SDK包的就行啦,我这里的是SDK1.6.2. 然后需要链接上依赖库,在Target —> BuildPhases —> Link Binary With Libraries— 点击+号 -> 搜索你需要的系统库。

SystemConfiguration.framework
libz.tbd
libsqlite3.0.tbd
CoreTelephony.framework
QuartzCore.framework

设置URL Scheme

在注册微信平台APP的时候,会给一个唯一识别标识符(APPID),在APP端开发步骤里面说得很清楚了,需要填在URL Schemes这个地方,

URL scheme

在Appdelegate中注册APPID
如下:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
  // Override point for customization after application launch.
  /**
   * 向微信终端注册ID,这里的APPID一般建议写成宏,容易维护。@“测试demo”不需用管。这里的id是假的,需要改这里还有target里面的URL Type
   */
  [WXApi registerApp:@"wxd930ea5d5a258f4f" withDescription:@"测试demo"];

  return YES;
}

处理微信通过URL启动时传递的数据

//前面的两个方法被iOS9弃用了,如果是Xcode7.2网上的话会出现无法进入进入微信的onResp回调方法,就是这个原因。本来我是不想写着两个旧方法的,但是一看官方的demo上写的这两个,我就也写了。。。。
//9.0前的方法,为了适配低版本 保留
- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url{
  return [WXApi handleOpenURL:url delegate:self];
}

- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation{
  return [WXApi handleOpenURL:url delegate:self];
}

//9.0后的方法
- (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<NSString *,id> *)options{
  //这里判断是否发起的请求为微信支付,如果是的话,用WXApi的方法调起微信客户端的支付页面(://pay 之前的那串字符串就是你的APPID,)
    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 = @支付结果:成功!;
        break;
      case -1:
        payResoult = @支付结果:失败!;
        break;
      case -2:
        payResoult = @用户已经退出支付!;
        break;
      default:
        payResoult = [NSString stringWithFormat:@支付结果:失败!retcode = %d, retstr = %@, resp.errCode,resp.errStr];
        break;
    }
  }
}

 最重要的来了!!!

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

需要的参数包括:appid、partid(商户号)、prepayid(预支付订单ID)、noncestr(参与签名的随机字符串)、timestamp(参与签名的时间戳)、sign(签名字符串)这六个。
在点击支付的控制器中使用核心代码来调起微信客户端支付,这些个参数都是后台传给你的。 加上了注释,应该很好理解的。

#pragma mark 微信支付方法
- (void)WXPay{

    //需要创建这个支付对象
    PayReq *req  = [[PayReq alloc] init];
    //由用户微信号和AppID组成的唯一标识,用于校验微信用户
    req.openID = @"";

    // 商家id,在注册的时候给的
    req.partnerId = @"";

    // 预支付订单这个是后台跟微信服务器交互后,微信服务器传给你们服务器的,你们服务器再传给你
    req.prepayId = @"";

    // 根据财付通文档填写的数据和签名
    //这个比较特殊,是固定的,只能是即req.package = Sign=WXPay
    req.package  = @"";

    // 随机编码,为了防止重复的,在后台生成
    req.nonceStr = @"";

    // 这个是时间戳,也是在后台生成的,为了验证支付的
    NSString * stamp = @"";
    req.timeStamp = stamp.intValue;

    // 这个签名也是后台做的
    req.sign = @"";

    //发送请求到微信,等待微信返回onResp
    [WXApi sendReq:req];
}

这个JSON里面的数据(上面的参数)就是后台需要传给你的,至于怎么来,也有后台的文档,让他去看下就行啦~~~

{
 "appid": "wxb4ba3c02aa476ea1",
 "noncestr": "d1e6ecd5993ad2d06a9f50da607c971c",
 "package": "Sign=WXPay",
 "partnerid": "10000100",
 "prepayid": "wx20160218122935e3753eda1f0066087993",
 "timestamp": "1455769775",
 "sign": "F6DEE4ADD82217782919A1696500AF06"
}

--统一下单API

--调起支付接口

到这里,不出意外的话应该都能正常的支付了。流程最重要,理解了就知道怎么做了,强烈建议需要做的朋友们先理理思路,不要急着下手。

PS:这篇文章中,签名都是在后台做的,如果需要在你客户端做,可以参考下这篇文章,和这篇文章,他们的签名在客户端做的,写的也比较详细了。

可能遇到的问题

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

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

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

4.微信支付的单位是分,被坑过的人都知道了。。。。哎。

如果在集成过程中遇到什么问题,大家可以一起讨论下

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • iOS实现微信支付流程详解

    背景 自微信支付.支付宝支付入世以来,移动端的支付日渐火热.虚拟货币有取代实体货币的趋向(这句纯属扯淡,不用管),支付在app开发中是一项基本的功能,有必要去掌握.从难易程度上讲,不管是微信支付还是支付宝支付都是非常简单的,因为第三方的支付文档非常详细,而且他们内部的安全性也非常高.作为使用这些支付策略的我们,只需要掌握流程,能够实现正常支付的功能即可.为什么要写下这篇博文,原因有二.其一,微信支付流程中有坑,其二,以后忘记了可以拿出来看看. 配置 1.微信支付需要两个账号,财付通和微信开发者,

  • IOS客户端接入微信支付

    实际上,从代码的角度,调起支付APP就是把一些关键的参数通过一定方式打包成为一个订单,然后发送到支付平台的服务器.所以,只要搞清楚了参数设置,搞清楚了每个支付平台的SDK里面一些关键API的使用,基本上就可以很简单的支持支付. 今天记录一下客户端里面,如何支持微信支付.首先.我们要仔细阅读一下微信SDK的开发文档,了解一下整个支付的大概流程. 然后根据提示,把相应的SDK下载下来,所谓的SDK,也就是一个链接库和两个头文件,很简单. 下载完毕,需要把SDK导入到工程里面,并且配置一下工程.因为开

  • 微信支付终于成功了(安卓、iOS)在此分享

    经过了几天的痛苦煎熬,终于把微信支付调通,整个调试过程很痛苦,痛苦的主要来源是微信支付的调试真的是,以前调试公众号支付也是一波三折啊.好吧,开始!首先说明,我这里主要没有使用getToken,getOrder方法,我的所有参数全部是在后端生成传递给前端的,看了一下前面朋友分享的源代码,还用到了jquery,md5,sha对于新手来说简直是天文啊,而且jquery在apicloud中效率不好,所以放弃了研究那个代码,另外官方也说了,最好签名等参数全部服务器端生成,微信也是这么说的. 注意:微信本身

  • 解决iOS调起微信支付显示系统繁忙问题

    最新刚到新公司接手一个项目,当微信支付时可以跳转到微信界面,但会弹出对话框显示 '系统繁忙',点击确定就留在微信,不返回APP,然后就各种调试,微信的DEMO和接入文档都看穿了,都还没能解决问题,网上也是找了各种答案,什么降低微信支付SDK版本,还有检查传过去的参数,也反复检查了参数,确实没发现问题,也没能解决我的问题,安卓那边可以微信支付,iOS这边不行,参数都是由服务器返回的一样的参数,所以也解决参数不会有问题,然后无意中看到了网上一个哥们的问题说和友盟分享SDK冲突了,刚好这个工程也集成了

  • iOS微信支付交互图分析

    微信支付交互图(一) 微信支付交互图(二) 配上自己的理解说明:(不断更新中-) 微信支付的流程图: 1.完成支付主要有三方构成: 用户,商户的App客户端,商户的后台系统,微信客户端,微信的支付系统; 2.用户登录商户的App,在商户的App上选择商品下单,然后通过商户App向商户的后台系统发出支付请求: 3.商户的后台系统接收到用户的支付请求后去调用微信的统一下单API,这时候微信的支付系统收到请求生成预支付单信息(prepay_id)返回给商户后台系统,商户后台系统接收后生成带有签名的客户

  • iOS微信支付开发案例

    微信支付有很多坑的,官方提供的文档一点都不全面,而且demo也比较"羞涩"难懂.很多注意的细节都没有体现出来,走了很多弯路.于是,系统的开发流程如下.(完整的demo附在博客最后面)这里面包括微信支付开发和支付宝开发调用客户端的兼容处理.(两次签名放在移动端,博客中没提到没安装微信客户端的情况,也很简单[WXApi sendReq:request]调用这个方法的返回值为0即可判断.) 一.环境配置 1.首先是https协议访问,在plist设置白名单 2.当你工程中有微信分享.收藏.支

  • iOS 9.0后微信支付回调处理实例

    如果是iOS 9.0之前,处理微信回调时,首先在APPDelegate中写如下的代码: //iOS 9.0 之前的处理方法不保证正确,如有错误还望指正 - (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation { if ([url.host isEqualToStrin

  • 微信支付开发IOS图文教程案例

    前言:下面介绍微信支付的开发流程的细节,图文并茂,你可以按照我的随笔流程过一遍代码.包你也学会了微信支付.而且支付也是面试常问的内容. 正文: 1.首先在开始使用微信支付之前,有一些东西是开发者必须要知道的,打开下面链接: https://pay.weixin.qq.com/wiki/doc/api/app.php?chapter=3_1 然后可以看到下面的页面,这个就是微信支付商户平台的开发文档,很多东西是可以查阅和了解的,在开发使用微信SDK支付功能的时候,遇到了问题也可以到这找找相关须知信

  • IOS 集成微信支付功能的实现方法

    IOS 集成微信支付功能的实现方法 第一步:集成微信的SDK https://pay.weixin.qq.com/wiki/doc/api/index.html 点击进入 下载对应SDK或示例,最后可以看看示例程序 第二步:在Xcode中填写微信开放平台申请的Appid Xcode>info>URL Types  中新建加入Appid 第三步:在Appdelegate.m 中注册微信支付 和回调 #import "WXApi.h" 添加 代理 WXApiDelegate -

  • iOS开发傻瓜式微信支付的方法教程

    前言 本文主要给大家介绍了关于iOS开发傻瓜式微信支付的相关内容,分享出来供大家参考学习,下面来一起看看详细的介绍吧. 方法步骤如下: 先下载微信SDK,如果集成了友盟分享里的微信,那就不用下载,也不用配置环境,因为配置友盟分享的时候已经把微信支付的环境都配置好了(包括框架,schema跳转,白名单)如果没有集成过友盟分享那么请到微信开放平台下载SDK 如果公司没有给微信平台的appkey则需要自己帮公司去微信平台申请 工程的bundle id 也要和在微信平台注册的bundle id一样 链接

随机推荐