当前位置: 首页 > 编程日记 > 正文

iOS微信支付集成 SDK1 7 5

最近做了一个新项目,涉及到支付宝和微信支付,支付宝和微信都是业界的老大哥,相信大家都有所觉得文档、SDK都是各种坑吧(纯粹吐槽而已),这是继上篇支付宝支付集成后接着的微信支付集成。

1.微信商户申请步骤 kf.qq.com/faq/120911V… 2.申请成功后说明 官方支付账户说明文档: pay.weixin.qq.com/wiki/doc/ap… 账户参数说明:

官方业务流程文档: pay.weixin.qq.com/wiki/doc/ap… 3.微信支付集成 open.weixin.qq.com/cgi-bin/sho… 1> 添加微信支付SDK

2> 添加库

4.开发步骤说明 官方开发步骤文挡: pay.weixin.qq.com/wiki/doc/ap… 1> 项目设置APPID,在工程项目中添加商户自己的APPID

商户在微信开放平台申请开发APP应用后,微信开放平台会生成APP的唯一标识APPID。在Xcode中打开项目,设置项目属性中的URL Schemes为您的APPID

2> iOS 9.0以上的系统如果要正常调起微信,还需要添加白名单,在工程项目的plist文件中添加

3> 开发者需要在工程中链接上:SystemConfiguration.framework, libz.dylib, libsqlite3.0.dylib, libc++.dylib, Security.framework, CoreTelephony.framework, CFNetwork.framework。

4> 在你的工程文件中选择Build Setting,在"Other Linker Flags"中加入**"-Objc -all_load"**,在Search Paths中添加 libWeChatSDK.a ,WXApi.h,WXApiObject.h,文件所在位置

5> 注册APPID 商户APP工程中引入微信lib库和头文件,调用API前,需要先向微信注册您的APPID,代码如下:

// 在appDelegate.m中,注册微信应用    
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {//向微信注册[WXApi registerApp:@"您的APPID"];
}
复制代码

6> 调起支付 商户服务器生成支付订单,先调用【统一下单API】生成预付单,获取到prepay_id后将参数再次签名传输给APP发起支付。以下是调起微信支付的关键代码: 为了安全性,以下字段最好从服务器去获取

// 调起微信支付
PayReq *request = [[PayReq alloc] init];
/** 微信分配的公众账号ID -> APPID */
request.partnerId = APPID;
/** 预支付订单 从服务器获取 */
request.prepayId = @"1101000000140415649af9fc314aa427";
/** 商家根据财付通文档填写的数据和签名 <暂填写固定值Sign=WXPay>*/
request.package = @"Sign=WXPay";
/** 随机串,防重发 */
request.nonceStr= @"a462b76e7436e98e0ed6e13c64b4fd1c";
/** 时间戳,防重发 */
request.timeStamp= @“1397527777";
/** 商家根据微信开放平台文档对数据做的签名, 可从服务器获取,也可本地生成*/
request.sign= @"582282D72DD2B03AD892830965F428CB16E7A256";
/* 调起支付 */
[WXApi sendReq:request];
复制代码

7> 支付结果回调 照微信SDK Sample,在类实现onResp函数,支付完成后,微信APP会返回到商户APP并回调onResp函数,开发者需要在该函数中接收通知,判断返回错误码,如果支付成功则去后台查询支付结果再展示用户实际支付结果。 注意: 一定不能以客户端返回作为用户支付的结果,应以服务器端的接收的支付通知或查询API返回的结果为准。 代码示例如下:

// 支付返回结果,实际支付结果需要去微信服务器端查询
-(void)onResp:(BaseResp *)resp {if([resp isKindOfClass:[PayResp class]]){switch (resp.errCode) {case WXSuccess:{NSlog(@"支付成功");// 发通知带出支付成功结果[[NSNotificationCenter defaultCenter] postNotificationName:QTXWXReturnSucceedPayNotification object:resp];}break;default:{NSlog(@“支付失败:%d”,resp.errCode);// 发通知带出支付失败结果[[NSNotificationCenter defaultCenter] postNotificationName:QTXWXReturnFailedPayNotification object:resp];}break;}}  
}
复制代码

具体使用先放一下我的部分代码:

  1. 一般微信支付和支付宝支付都会被一起集成,这边就要在appDelegate.m中一起整理判断回调
 这里处理新浪微博SSO授权之后跳转回来,和微信/支付宝支付完成之后跳转回来*/
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation
{BOOL result = [UMSocialSnsService handleOpenURL:url wxApiDelegate:nil];if (result == NO) {  // 調用其他 SDK 支付寶//如果极简 SDK 不可用,会跳转支付宝钱包进行支付,需要将支付宝钱包的支付结果回传给 SDKif ([url.host isEqualToString:@"safepay"]) {//跳转支付宝钱包进行支付,处理支付结果[[AlipaySDK defaultService] processOrderWithPaymentResult:url standbyCallback:^(NSDictionary *resultDic) {QTXLog(@"支付宝客户端支付结果result = %@",resultDic);if (resultDic && [resultDic objectForKey:@"resultStatus"] && ([[resultDic objectForKey:@"resultStatus"] intValue] == 9000)) {// 发通知带出支付成功结果[QTXNotificationCenter postNotificationName:QTXAliReturnSucceedPayNotification object:resultDic];} else {// 发通知带出支付失败结果[QTXNotificationCenter postNotificationName:QTXAliReturnFailedPayNotification object:resultDic];}}];}if ([url.host isEqualToString:@"platformapi"]){//支付宝钱包快登授权返回 authCode[[AlipaySDK defaultService] processAuthResult:url standbyCallback:^(NSDictionary *resultDic) {QTXLog(@"支付宝网页版result = %@",resultDic);if (resultDic && [resultDic objectForKey:@"resultStatus"] && ([[resultDic objectForKey:@"resultStatus"] intValue] == 9000)) {// 发通知带出支付成功结果[QTXNotificationCenter postNotificationName:QTXAliReturnSucceedPayNotification object:resultDic];} else {// 发通知带出支付失败结果[QTXNotificationCenter postNotificationName:QTXAliReturnFailedPayNotification object:resultDic];}}];}//微信的支付回调if ([url.host isEqualToString:@"pay"]) {return [WXApi handleOpenURL:url delegate:[WXApiManager sharedManager]];}}return result;
}
复制代码
// NOTE: 9.0以后使用新API接口
- (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<NSString*, id> *)options
{BOOL result = [UMSocialSnsService handleOpenURL:url];if (result == NO) {  // 調用其他 SDK 支付寶//如果极简 SDK 不可用,会跳转支付宝钱包进行支付,需要将支付宝钱包的支付结果回传给 SDKif ([url.host isEqualToString:@"safepay"]) {//跳转支付宝钱包进行支付,处理支付结果[[AlipaySDK defaultService] processOrderWithPaymentResult:url standbyCallback:^(NSDictionary *resultDic) {QTXLog(@"支付宝客户端支付结果result = %@",resultDic);if (resultDic && [resultDic objectForKey:@"resultStatus"] && ([[resultDic objectForKey:@"resultStatus"] intValue] == 9000)) {// 发通知带出支付成功结果[QTXNotificationCenter postNotificationName:QTXAliReturnSucceedPayNotification object:resultDic];} else {// 发通知带出支付失败结果[QTXNotificationCenter postNotificationName:QTXAliReturnFailedPayNotification object:resultDic];}}];}if ([url.host isEqualToString:@"platformapi"]){//支付宝钱包快登授权返回 authCode[[AlipaySDK defaultService] processAuthResult:url standbyCallback:^(NSDictionary *resultDic) {QTXLog(@"支付宝网页版result = %@",resultDic);if (resultDic && [resultDic objectForKey:@"resultStatus"] && ([[resultDic objectForKey:@"resultStatus"] intValue] == 9000)) {// 发通知带出支付成功结果[QTXNotificationCenter postNotificationName:QTXAliReturnSucceedPayNotification object:resultDic];} else {// 发通知带出支付失败结果[QTXNotificationCenter postNotificationName:QTXAliReturnFailedPayNotification object:resultDic];}}];}//微信的支付回调if ([url.host isEqualToString:@"pay"]) {return [WXApi handleOpenURL:url delegate:[WXApiManager sharedManager]];}}return result;
}- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url {return  [WXApi handleOpenURL:url delegate:[WXApiManager sharedManager]];
}复制代码
  1. 在使用微信支付的当前控制器里:
// 调起微信支付,接收通知,并且判断手机是否安装微信
- (void)weChatPay {// 1.拼接请求参数NSMutableDictionary *params = [NSMutableDictionary dictionary];params[@"orderid"] = self.order;params[@"userIp"] = [QTXGetIPTool deviceIPAdress]; // 获取当前设备的ip// 2.发送请求__weak __typeof(self) weakSelf = self;[QTXHttpTool post:QTX_weChatPay_url params:params success:^(id json) {QTXLog(@"微信支付返回参数接口 请求成功-%@", json);if ([json[@"success"] isEqual:@(YES)]) {NSMutableDictionary *wechatDic = json[@"data"];[WXApi registerApp:[wechatDic objectForKey:@"appid"]];PayReq *request = [[PayReq alloc] init];request.partnerId = [wechatDic objectForKey:@"mch_id"]; // 商家向财付通申请的商家idrequest.prepayId= [wechatDic objectForKey:@"prepay_id"]; // 支付订单request.package = @"Sign=WXPay"; // Sign=WXPay 商家根据财付通文档填写的数据和签名request.nonceStr= [wechatDic objectForKey:@"nonce_str"]; // 随机串,防重发request.timeStamp= [[wechatDic objectForKey:@"timestamp"] intValue]; //时间戳,防重发request.sign= [wechatDic objectForKey:@"sign2"]; // 商家根据微信开放平台文档对数据做的签名 二次签名if ([WXApi sendReq:request]) {[QTXNotificationCenter addObserver:self selector:@selector(paySucceed) name:QTXWXReturnSucceedPayNotification object:nil];[QTXNotificationCenter addObserver:self selector:@selector(payFailed) name:QTXWXReturnFailedPayNotification object:nil];} else { // 未安装微信客户端相关处理QTXAlterView *alter = [[QTXAlterView alloc] initWithMessage:[NSString stringWithFormat:@"未安装微信客户端,请使用其他支付方式"] delegate:self rightButtonTitle:@"确定" otherButtonTitles:nil];[alter show];}} else {[MBProgressHUD showError:[NSString stringWithFormat:@"%@", json[@"errorMessage"]]];}[weakSelf.tableView reloadData];} failure:^(NSError *error) {[MBProgressHUD showError:@"暂无网络,稍后再试"];QTXLog(@"微信支付返回参数接口 请求失败-%@", error);}];}
复制代码

目前微信支付SDK已经更新到1.7.5, 我这边也同步更新下. 其实在原有版本基础上,只需要增加以下三点:

  1. 更新支持iOS启用 ATS(App Transport Security)
  2. 需要在工程中链接CFNetwork.framework
  3. 在工程配置中的”Other Linker Flags”中加入”-Objc -all_load”

如果需要支付宝支付集成, 请移步: iOS支付宝支付集成

相关文章:

【青少年编程(第26周)】一下子多了很多事!

2021年08月15日&#xff08;周日&#xff09;晚20:00我们在青少年编程竞赛交流群开展了第二十六次直播活动。我们直播活动的主要内容如下&#xff1a; 首先&#xff0c;我们奖励了上周测试超过60分的小朋友。 其次&#xff0c;介绍了Datawhale青少年组队学习活动的规划&#x…

Python培训教程分享:10款超好用的Python开发工具

学会Python技术后&#xff0c;我们在参加工作的时候如果能有辅助工具的话&#xff0c;那么会很大程度的提高我们的工作效率&#xff0c;那么Python都有哪些好用的开发工具呢?下面小编就为大家详细的介绍一下10款超好用的Python开发工具! Python培训教程分享&#xff1a;10款超…

pfSense book之2.4安装指南

pfSense商店的硬件产品都预装了pfSense软件。要重新安装pfSense软件或将其安装到其他硬件&#xff0c;请按照本章所述下载安装程序映像。警告预先从pfSense商店或授权合作伙伴以外的商业供应商预装pfSense软件的硬件不值得信任。 第三方可能已经对软件进行了未经授权的、未知的…

css中绝对定位中的left和top属性

<html><head><title>Absolute Position</title><style type "text/css">/*body具有红色边框&#xff0c;宽度300px&#xff0c;高度300px*/body {border: 1px solid red;width: 300px;height: 300px;}/*被绝对定位,颜色为silver*/div…

教育部办公厅关于2020-2021学年面向中小学生的全国性竞赛活动名单的公示

来源&#xff1a; http://www.moe.gov.cn/jyb_xxgk/s5743/s5745/202007/t20200701_469571.html 教育部办公厅关于2020-2021学年面向中小学生的全国性竞赛活动名单的公示 根据《教育部办公厅印发<关于面向中小学生的全国性竞赛活动管理办法&#xff08;试行&#xff09;&g…

UI设计培训分享:UI设计师如何准备面试?

很多参加完UI培训的同学后期都是需要面临找工作的&#xff0c;那么面试环节是必须要经历的&#xff0c;今天小编为大家介绍的内容就是关于UI设计师如何准备面试?希望下面的内容能够帮助到正在找工作的同学们。 UI设计培训分享&#xff1a;UI设计师如何准备面试? 一、 简历要重…

【CLR的执行模型:将源代码编译成托管模块】

CLR:由多种不同编程语言使用的运行库 托管模块&#xff1a;中间语言和元数据 非托管语言&#xff1a;C/C&#xff0c;不过此为特殊&#xff0c;可以写成托管代码 托管语言&#xff1a;C# 托管模块 1,PE32/PE32头:PE32运行在win32位系统中,win32运行在64位系统 2,CLR头,包括CLR版…

【组队学习】【28期】数据采集从入门到精通

数据采集从入门到精通 论坛版块&#xff1a; http://datawhale.club/c/team-learning/38-category/38 开源内容&#xff1a; https://github.com/datawhalechina/team-learning-program/tree/master/CollectData 学习目标 随着数字化的不断推进&#xff0c;数据采集在数据…

url传递数据类型

php中传递数据&#xff0c;get或post方式为啥用字符串传递&#xff0c;为什么不能直接用数组形式&#xff0c;用的话可以吗 转载于:https://www.cnblogs.com/guoyinglichong/p/8184723.html

零基础参加java培训哪家机构好

零基础想要学会java技术&#xff0c;那么参加java培训机构是非常明智的选择&#xff0c;为什么这么说呢?因为如果选择自学&#xff0c;那么不仅学到的技术杂乱无章&#xff0c;后期工作也会有很大阻碍&#xff0c;系统的学习就会好很多&#xff0c;那么如今零基础参加java培训…

如何通过一行代码下载B站视频?

文章目录如何通过一行代码下载B站视频&#xff1f;Step1&#xff1a;安装you-getStep2&#xff1a;下载B站视频总结如何通过一行代码下载B站视频&#xff1f; You-Get 是一个基于 Python 3 的下载工具。使用 You-Get 可以很轻松的下载网络上的视频、图片及音乐。 下面我们介绍…

软件架构是软件的组织形式

软件架构是软件的组织形式 软件架构是软件的逻辑组织形式&#xff1b; 软件框架是软件的物理组织形式。

linux创建用户并授予sudo权限

1. 新建用户 rootubuntu:~# adduser hadoop rootubuntu:~# passwd hadoop #为hadoop用户设置密码 2. 为hadoop用户添加sudo权限 rootubuntu:~# sudo gedit /etc/sudoers 把root那行复制后改成hadoop&#xff0c;hadoop就有了sudo权限&#xff0c;需要sudo密码则为ALL&#xff0…

学java培训开发需要多少钱

学java培训开发需要多少钱?这个问题对于想要学习java技术的小伙伴们来说是非常重要的&#xff0c;如今市面上的java培训机构非常多&#xff0c;收费标准都是多少呢?那么来看看下面的详细介绍吧。 学java培训开发需要多少钱?不少学员会直接咨询费用的问题&#xff0c;确实&am…

Scratch青少年编程能力等级测试模拟题(一级)

青少年编程竞赛交流群已成立&#xff08;适合6至18周岁的青少年&#xff09;&#xff0c;公众号后台回复【Scratch】或【Python】&#xff0c;即可进入。如果加入了之前的社群不需要重复加入。 微信后台回复“资料下载”可获取以往学习的材料&#xff08;视频、代码、文档&…

ODBC、OLE连接各种数据库的连接字符串

简介 我们在使用数据库的时候&#xff0c;首先需要打开这个数据库。我们可以找到集中类型的数据库&#xff0c;每个都使用不同的连接方式。下面列举了一下主要的数据库的连接字符串A&#xff1a;使用ODBC方式1:dBASE连接字符串strConnection _T("Driver{Microsoft dBASE …

opencv3 图像处理(一)图像缩放( python与c++ 实现)

opencv3 图像处理 之 图像缩放&#xff08; python与c实现 &#xff09; 一. 主要函数介绍 1) 图像大小变换 Resize () 原型&#xff1a; void Resize(const CvArr* src,CvArr* dst,intinterpolationCV_INTER_LINEAR); 说明&#xff1a; src 表示输入图像。 dst表示输出图像。 …

web前端培训要学多久

​ 近几年web前端在互联网行业的快速发展&#xff0c;很多人都对web前端是非常感兴趣的&#xff0c;学习web前端技术的人越来越多&#xff0c;那么参加web前端培训要学多久呢?相信大家都想知道这个答案&#xff0c;我们来看看下面的详细介绍。 web前端培训要学多久?首先对于前…

【Arduino】开发入门教程【一】什么是Arduino

Arduino Arduino 是一款便捷灵活、方便上手的开源电子原型平台&#xff0c;包含硬件&#xff08;各种型号的arduino板&#xff09;和软件&#xff08;arduino IDE)。它适用于艺术家、设计师、爱好者和对于“互动”有兴趣的朋友们。Arduino&#xff0c;是一个基于开放原始码的软…

【云计算的1024种玩法】回忆经典,用虚拟主机重建复古DZ和无心宠物

前言 在移动互联网和大型网游没有普及前&#xff0c;很多地方论坛或者专业性论坛都会有一个 —— “无心宠物” 插件来引流和吸引用户&#xff0c;可以说是当下网页游戏的老前辈了。还记得我以前就是为了玩这个游戏&#xff0c;就在各个论坛疯狂发帖赚经验&#xff0c;想来还是…

谢文睿:西瓜书 + 南瓜书 吃瓜系列 9. 集成学习(上)

Datawhale南瓜书是经典机器学习教材《机器学习》&#xff08;西瓜书&#xff09;的公式推导解析指南&#xff0c;旨在让在学习西瓜书的过程中&#xff0c;再也没有难推的公式&#xff0c;学好机器学习。 航路开辟者&#xff1a;谢文睿、秦州开源内容&#xff1a;https://githu…

java培训分享:java软件开发可以用哪些软件?

从事java相关工作的小伙伴应该都有一个习惯&#xff0c;那就是运用软件的方便来达到高效率工作&#xff0c;本期小编为大家介绍的java培训教程就是关于“java软件开发可以用哪些软件?”的内容&#xff0c;来看看下面的详细介绍吧。 java软件开发可以用哪些软件? MyEclipse 顾…

Ext-第一课基本配置

(1)废话&#xff1a;最近开始学习使用Ext&#xff0c;所以记录下来自己的配置和新的&#xff0c;提供给新手菜鸟们&#xff0c;希望能对你有所帮助。 (2)走着&#xff1a;官方文档&#xff1a;http://www.myext.cn/ext-3.2.1/docs/ 我使用的是ext-3.3.0 下载解压后如下图&#…

Only POT texture can be compressed to PVRTC format

在图片压缩格式 报这个Warning的时候&#xff0c;意思是该图片必须要采用2的幂次方大小才能使用该格式。 POT: Power of Two. 采取方式是在advanced里边&#xff0c;把Non Power of 2 设置一下。或者原图采用幂次方大小。

【青少年编程】【一级】 奔跑的马

奔跑的马 1. 准备工作 &#xff08;1&#xff09;添加背景 Forest 和 Wetland&#xff1b; &#xff08;2&#xff09;添加角色Unicorn Running&#xff1b; &#xff08;3&#xff09;为Unicorn Running 添加声音 Gallop。 2. 功能实现 &#xff08;1&#xff09;点击绿旗…

Python培训教程:Python有哪些比较重要的内置函数?

学习Python技术或者参加Python工作的小伙伴们应该都知道&#xff0c;在Python编程语言中会经常出现很多内置函数&#xff0c;很少有人清楚这些函数&#xff0c;但是它的功能是不可小觑的&#xff0c;下面小编就为大家详细介绍一下Python有哪些比较重要的内置函数? Python培训教…

Oracle Block浅析2:ITL(Interested Transaction List)

一.ITL(Interested Transaction List)&#xff1a; ITL(Interested Transaction List)是Oracle数据块内部的一个组成部分&#xff0c;位于数据块头&#xff08;block header&#xff09;&#xff0c;itl由xid&#xff0c;uba&#xff0c;flag&#xff0c;lck和scn/fsc组成&…

极速发展的饿了么订单系统架构演进

http://www.infoq.com/cn/articles/eleme-order-system-architecture-evolution?utm_sourceinfoq&utm_mediumrelated_content_link&utm_campaignrelatedContent_presentations_clk 本文根据石佳宁在2016ArchSummit全球架构师&#xff08;深圳&#xff09;峰会上的演讲…

【青少年编程(第27周)】报名考级的小朋友注意截止时间!

2021年08月22日&#xff08;周日&#xff09;晚20:00我们在青少年编程竞赛交流群开展了第二十七次直播活动。我们直播活动的主要内容如下&#xff1a; 首先&#xff0c;我们奖励了上周测试超过60分的小朋友。 其次&#xff0c;提醒小朋友们不要忘记9月份等级测试的报名&#x…

找java培训机构有哪些参考标准

java培训机构在市面上越来越多&#xff0c;这对于想要学习java技术的小伙伴们来说是比较难选择的&#xff0c;尤其是零基础的小伙伴&#xff0c;那么到底该如何找适合自己的java培训机构呢?找java培训机构有哪些参考标准?来看看下面小编的详细介绍就知道了。 找java培训机构有…