iOS开发支付集成之微信支付(3)

2023-12-14 14:32

本文主要是介绍iOS开发支付集成之微信支付(3),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

这一篇是《iOS开发之支付》这一部分的继支付宝支付集成,银联支付集成第三篇,微信支付。在集成的时候建议都要去下载最新版的SDK,因为我知道的前不久支付宝,银联都更新了一次,微信的不太清楚更新了没。

在被支付宝、银联坑过之后,发现其实微信支付的集成并没有想象中的那么困难,像支付宝那样简单地调用个方法就行,重要的难的部分都是后台来做的。微信支付也是需要签名的,也跟支付宝一样,可以在客户端签名,也可以在后台签名(当然,为了安全还是推荐在服务器上做签名,逻辑也比较好理解)。

集成前首先要看看文档,
开发文档在这里

app开发步骤这里

ps:在微信开发者平台注册APP这样的事一般的是经理给你做好的,这个可以忽略,如果需要做的话,可以参考这篇文章。链接

交互流程
这个流程和支付宝的流程都差不多,理解了其实是一样的。

这里写图片描述

首先需要理清楚流程:

用户使用APP客户端,选择商品下单。
商户客户端(就是你做的APP)将用户的商品数据传给商户服务器,请求生成支付订单。
商户后台调用统一下单API向微信的服务器发送请求,微信服务器生成预付单,并生成一个prepay_id返回给商户后台。
商户后台将这个prepay_id返回给商户客户端。
用户点击确认支付,这时候商户客户端调用SDK打开微信客户端,进行微信支付。
微信客户端向微信服务器发起支付请求并返回支付结果(他们之间交互用的就是prepay_id这个参数,微信的服务器要验证微信客户端传过去的参数是否跟第三步中生成的那个id一致)。
用户输入支付密码后,微信客户端提交支付授权,跟微信服务器交互,完成支付
微信服务器给微信客户端发送支付结果提示,并异步给商户服务器发送支付结果通知。
商户客户端通过支付结果回调接口查询支付结果,并向后台检查支付结果是否正确,后台返回支付结果。
商户客户端显示支付结果,完成订单,发货。
虽然看起来有点多,但是理解起来并不复杂,跟我们平时手机上买东西是一样的。我们客户端需要做的就是

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

集成过程
首先是要下载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这个地方,

这里写图片描述

在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启动时传递的数据

处理微信通过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
{  //启动微信支付的responseNSString *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=WXPayreq.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.微信支付的单位是分,被坑过的人都知道了。。。。哎,

如果在集成过程中遇到什么问题,大家可以一起讨论下,我记录这些如果有什么错误的话也请告诉我!谢谢!

文/WK_IOSDevelpoer(简书作者)
原文链接:http://www.jianshu.com/p/1c1c834b6d52
著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”。

这篇关于iOS开发支付集成之微信支付(3)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/492895

相关文章

Python38个游戏开发库整理汇总

《Python38个游戏开发库整理汇总》文章介绍了多种Python游戏开发库,涵盖2D/3D游戏开发、多人游戏框架及视觉小说引擎,适合不同需求的开发者入门,强调跨平台支持与易用性,并鼓励读者交流反馈以... 目录PyGameCocos2dPySoyPyOgrepygletPanda3DBlenderFife

使用Python开发一个Ditto剪贴板数据导出工具

《使用Python开发一个Ditto剪贴板数据导出工具》在日常工作中,我们经常需要处理大量的剪贴板数据,下面将介绍如何使用Python的wxPython库开发一个图形化工具,实现从Ditto数据库中读... 目录前言运行结果项目需求分析技术选型核心功能实现1. Ditto数据库结构分析2. 数据库自动定位3

Django开发时如何避免频繁发送短信验证码(python图文代码)

《Django开发时如何避免频繁发送短信验证码(python图文代码)》Django开发时,为防止频繁发送验证码,后端需用Redis限制请求频率,结合管道技术提升效率,通过生产者消费者模式解耦业务逻辑... 目录避免频繁发送 验证码1. www.chinasem.cn避免频繁发送 验证码逻辑分析2. 避免频繁

Spring Boot集成/输出/日志级别控制/持久化开发实践

《SpringBoot集成/输出/日志级别控制/持久化开发实践》SpringBoot默认集成Logback,支持灵活日志级别配置(INFO/DEBUG等),输出包含时间戳、级别、类名等信息,并可通过... 目录一、日志概述1.1、Spring Boot日志简介1.2、日志框架与默认配置1.3、日志的核心作用

Apache Ignite 与 Spring Boot 集成详细指南

《ApacheIgnite与SpringBoot集成详细指南》ApacheIgnite官方指南详解如何通过SpringBootStarter扩展实现自动配置,支持厚/轻客户端模式,简化Ign... 目录 一、背景:为什么需要这个集成? 二、两种集成方式(对应两种客户端模型) 三、方式一:自动配置 Thick

Python对接支付宝支付之使用AliPay实现的详细操作指南

《Python对接支付宝支付之使用AliPay实现的详细操作指南》支付宝没有提供PythonSDK,但是强大的github就有提供python-alipay-sdk,封装里很多复杂操作,使用这个我们就... 目录一、引言二、准备工作2.1 支付宝开放平台入驻与应用创建2.2 密钥生成与配置2.3 安装ali

PyQt5 GUI 开发的基础知识

《PyQt5GUI开发的基础知识》Qt是一个跨平台的C++图形用户界面开发框架,支持GUI和非GUI程序开发,本文介绍了使用PyQt5进行界面开发的基础知识,包括创建简单窗口、常用控件、窗口属性设... 目录简介第一个PyQt程序最常用的三个功能模块控件QPushButton(按钮)控件QLable(纯文本

OpenCV在Java中的完整集成指南分享

《OpenCV在Java中的完整集成指南分享》本文详解了在Java中集成OpenCV的方法,涵盖jar包导入、dll配置、JNI路径设置及跨平台兼容性处理,提供了图像处理、特征检测、实时视频分析等应用... 目录1. OpenCV简介与应用领域1.1 OpenCV的诞生与发展1.2 OpenCV的应用领域2

SpringBoot集成MyBatis实现SQL拦截器的实战指南

《SpringBoot集成MyBatis实现SQL拦截器的实战指南》这篇文章主要为大家详细介绍了SpringBoot集成MyBatis实现SQL拦截器的相关知识,文中的示例代码讲解详细,有需要的小伙伴... 目录一、为什么需要SQL拦截器?二、MyBATis拦截器基础2.1 核心接口:Interceptor

SpringBoot集成EasyPoi实现Excel模板导出成PDF文件

《SpringBoot集成EasyPoi实现Excel模板导出成PDF文件》在日常工作中,我们经常需要将数据导出成Excel表格或PDF文件,本文将介绍如何在SpringBoot项目中集成EasyPo... 目录前言摘要简介源代码解析应用场景案例优缺点分析类代码方法介绍测试用例小结前言在日常工作中,我们经