ios 微信支付

服务器签名版本

官方已经是建议使用服务器签名来接入微信支付,实际上从安全上考虑,确实是每个客户端不应该知道RAS密钥,也不需要每个客户端都写一遍签名的算法。

服务端接入流程文档:https://pay.weixin.qq.com/wiki/doc/api/app.php?chapter=8_3

商户系统和微信支付系统主要交互说明:

步骤1:用户在商户APP中选择商品,提交订单,选择微信支付。

步骤2:商户后台收到用户支付单,调用微信支付统一下单接口。参见【统一下单API】。

步骤3:统一下单接口返回正常的prepay_id,再按签名规范重新生成签名后,将数据传输给APP。参与签名的字段名为appId,partnerId,prepayId,nonceStr,timeStamp,package。注意:package的值格式为Sign=WXPay

步骤4:商户APP调起微信支付。api参见本章节【app端开发步骤说明】

步骤5:商户后台接收支付通知。api参见【支付结果通知API】

步骤6:商户后台查询支付结果。,api参见【查询订单API】

1.导入SDK文件

2.导入相关的系统库及文件。不导入会报错。

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

3.配置info.plist

a.schemes ,注意,item0 这里要修改成商户自己的APPID

或者这样修改:

b.白名单

c.安全配置支持Http

当然这部分的配置,也可以通过修改XML来实现。

4.修改bitcode。

修改:

5.在AppDelegate 注册微信

导入#import "WXApiManager.h"

复制代码
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {//向微信注册wxd930ea5d5a258f4f[WXApi registerApp:@"wxb4ba3c02aa476ea1" withDescription:@"demo 2.0"];return YES;
}- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url {return  [WXApi handleOpenURL:url delegate:[WXApiManager sharedManager]];
}- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation {return [WXApi handleOpenURL:url delegate:[WXApiManager sharedManager]];
}
复制代码

6.接下来,就是发起请求支付了,实现上核心代码只有几行。

这部分代码在demo的WXApiRequestHandler--》jumpToBizPay 里。

复制代码
                    //调起微信支付PayReq* req             = [[[PayReq alloc] init]autorelease];req.partnerId           = [dict objectForKey:@"partnerid"];req.prepayId            = [dict objectForKey:@"prepayid"];req.nonceStr            = [dict objectForKey:@"noncestr"];req.timeStamp           = stamp.intValue;req.package             = [dict objectForKey:@"package"];req.sign                = [dict objectForKey:@"sign"];[WXApi sendReq:req];
复制代码

7.不管支付成功还是失败,结果会返回到WXApiManager--》onResp 方法下

复制代码
        switch (resp.errCode) {case WXSuccess:strMsg = @"支付结果:成功!";NSLog(@"支付成功-PaySuccess,retcode = %d", resp.errCode);break;default:strMsg = [NSString stringWithFormat:@"支付结果:失败!retcode = %d, retstr = %@", resp.errCode,resp.errStr];NSLog(@"错误,retcode = %d, retstr = %@", resp.errCode,resp.errStr);break;}
复制代码

我们直接处理回调结果即可。

客户端进行签名

1.导入文件。官方已经不提供这个SDK的下载了,我已经打包到源代码了,2015年3月11号最新修改的版本

 

2.里面有两个文件是非arc的,我们需要设置一下 -fno-objc-arc

3.导入系统库及info.list配置,请参数上面服务端签名。

4.AppDelegate配置

1)导入头文件

#import "WXApi.h"
#import "payRequsestHandler.h"

2)实现微信代理

@interface AppDelegate ()<WXApiDelegate>@end

3)注册微信,及微信支付回调

复制代码
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {// Override point for customization after application launch.//向微信注册[WXApi registerApp:APP_ID withDescription:@"demo 2.0"];return YES;
}- (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];
}// 微信支付成功或者失败回调
-(void) onResp:(BaseResp*)resp
{NSString *strMsg = [NSString stringWithFormat:@"errcode:%d", resp.errCode];NSString *strTitle;if([resp isKindOfClass:[SendMessageToWXResp class]]){strTitle = [NSString stringWithFormat:@"发送媒体消息结果"];}if([resp isKindOfClass:[PayResp class]]){//支付返回结果,实际支付结果需要去微信服务器端查询strTitle = [NSString stringWithFormat:@"支付结果"];switch (resp.errCode) {case WXSuccess:strMsg = @"支付结果:成功!";NSLog(@"支付成功-PaySuccess,retcode = %d", resp.errCode);break;default:strMsg = [NSString stringWithFormat:@"支付结果:失败!retcode = %d, retstr = %@", resp.errCode,resp.errStr];NSLog(@"错误,retcode = %d, retstr = %@", resp.errCode,resp.errStr);break;}}UIAlertView *alert = [[UIAlertView alloc] initWithTitle:strTitle message:strMsg delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil, nil];[alert show];
}
复制代码

5.写方法直接在支付时调用

复制代码
- (void)payForWechat
{//创建支付签名对象payRequsestHandler *req = [[payRequsestHandler alloc] init];//初始化支付签名对象[req init:APP_ID mch_id:MCH_ID];//设置密钥[req setKey:PARTNER_ID];NSMutableDictionary *dict = [req sendPay_demo];if(dict != nil){NSMutableString *retcode = [dict objectForKey:@"retcode"];if (retcode.intValue == 0){NSMutableString *stamp  = [dict objectForKey:@"timestamp"];//调起微信支付PayReq* req             = [[PayReq alloc] init];req.openID              = [dict objectForKey:@"appid"];req.partnerId           = [dict objectForKey:@"partnerid"];req.prepayId            = [dict objectForKey:@"prepayid"];req.nonceStr            = [dict objectForKey:@"noncestr"];req.timeStamp           = stamp.intValue;req.package             = [dict objectForKey:@"package"];req.sign                = [dict objectForKey:@"sign"];[WXApi sendReq:req];//日志输出NSLog(@"appid=%@\npartid=%@\nprepayid=%@\nnoncestr=%@\ntimestamp=%ld\npackage=%@\nsign=%@",req.openID,req.partnerId,req.prepayId,req.nonceStr,(long)req.timeStamp,req.package,req.sign );}else{[self alert:@"提示信息" msg:[dict objectForKey:@"retmsg"]];}}else{[self alert:@"提示信息" msg:@"服务器返回错误,未获取到json对象"];}
}//客户端提示信息
- (void)alert:(NSString *)title msg:(NSString *)msg
{UIAlertView *alter = [[UIAlertView alloc] initWithTitle:title message:msg delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil];[alter show];
}
复制代码

转载于:https://www.cnblogs.com/fantasy3588/p/5215379.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/543646.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python | 基于参数和返回值的功能分类

There are following types of the functions based on their parameters and return values: 根据函数的参数和返回值&#xff0c;有以下几种类型的函数&#xff1a; Function with no argument and no return value 没有参数也没有返回值的函数 Function with no argument …

macos可以升级到指定版本吗_承装承修承试可以跨级升级吗?

在建筑行业&#xff0c;通常我们所说的承装承修承试&#xff0c;也就是指承装(修、试)电力设施许可证。承装(修、试)电力设施许可证的功能作用相当于建筑资质&#xff0c;企业需要办理许可证后才能承接电力设施的安装、维护、调试等工程项目。承装(修、试)电力设施许可证可以办…

C#对config配置文件的管理

应用程序配置文件&#xff0c;对于asp.net是 web.config&#xff0c;对于WINFORM程序是App.Config(ExeName.exe.config)。 配置文件&#xff0c;对于程序本身来说&#xff0c;就是基础和依据&#xff0c;其本质是一个xml文件&#xff0c;对于配置文件的操作&#xff0c;从.NET…

16位的数字高字节和低字节_显示掩盖较低和较高的16位数字半字节| 8086微处理器...

16位的数字高字节和低字节Problem: To show masking of lower and higher nibbles of 16bit number using 8086 Microprocessor. 问题&#xff1a;使用8086微处理器显示对16位数字的较高半字节和较低半字节的屏蔽。 Assumption: 假设&#xff1a; Number is stored at memory…

一个事物两个方面的对比举例_顶管施工也有讲究,两个方面一个个来

顶管施工其实就是我们平时说的不开挖或者非开挖施工啦&#xff0c;其原理是借助于主顶油缸及管道间、中继间等推力&#xff0c;把工具管或掘进机从工作坑内穿过土层一直推进到接收坑内吊起。管道紧随工具管或掘进机后&#xff0c;埋设在两坑之间。为了响应中央的号召&#xff1…

SQLServer中的死锁的介绍

简介 什么是死锁&#xff1f; 我认为&#xff0c;死锁是由于两个对象在拥有一份资源的情况下申请另一份资源&#xff0c;而另一份资源恰好又是这两对象正持有的&#xff0c;导致两对象无法完成操作&#xff0c;且所持资源无法释放。 什么又是阻塞&#xff1f; 阻塞是由于资源不…

c语言位运算符的使用_C语言程序使用位运算符检查给定数字是否为回文

c语言位运算符的使用Problem statement: Write a C program to check whether a number (binary representation) is palindrome or not using bitwise operators. Maximum input is 255.. 问题陈述&#xff1a;编写一个C程序以使用按位运算符检查数字(二进制​​表示形式)是否…

解析取值_圆锥曲线——高中解析几何全归纳

这是一系列文章&#xff0c;我将在接下来了80多天&#xff0c;尽力把理科比较难的大题题型全部归纳一下然后在最后我会告诉做解析几何的窍门&#xff0c;让你的解析几何不再没有头绪&#xff0c;拿到既可做全文干货&#xff0c;不掺水&#xff0c;可以说总结了解析几何中你能遇…

Tomcat版本与Servlet、JSP等版本的支持关系

2019独角兽企业重金招聘Python工程师标准>>> 转载于:https://my.oschina.net/garyxiong/blog/624619

php 随机两位小数数_使用8086微处理器找出两个8位N数数组

php 随机两位小数数Problem statement: 问题陈述&#xff1a; Write a program in 8086 microprocessor to find out the sum of two arrays of 8-bit n numbers, where size “n” is stored at offset 500 and the numbers of first array are stored from offset 501 and t…

人类一败涂地做图教程_绘画步骤_人类一败涂地鼠绘人物步骤与技巧_3DM单机

第一波根据自己喜欢的人物角色选好模型&#xff0c;模型选不好画出来就不像第二步 对模型进行上色 在上色时可选择对某一部位涂色第三步绘制人物服装细节&#xff0c;首先是起个大概的形状 &#xff0c;ALT镜头拉进&#xff0c;画笔最小化&#xff0c;然后利用底色扣细建议先从…

java向数组中增加新元素_用Java中的新元素替换List的给定索引处的元素

java向数组中增加新元素Given a list of the integers and we have to replace it an element from specified index with a new element in java. 给定一个整数列表&#xff0c;我们必须用Java中的新元素将其替换为指定索引中的一个元素。 To replace an element in the list…

微服务架构会和分布式单体架构高度重合吗

在最近的Microservices Practitioner Summit峰会上&#xff0c;来自Facebook的工程师Ben Christensen就目前正在普遍快速增长的分布式系统与二进制依赖关系的一种反面模式发表了自己的看法。\\Christensen谈到说&#xff0c;共享类库是整个服务运行过程中最需要的部分&#xff…

北京soul_Soul高智商情侣,机器人博士邂逅科技记者,跨越1200公里来相爱

她&#xff0c;是知名媒体的科技记者&#xff0c;平时往返于帝都各大互联网媒体峰会上&#xff0c;朋友圈都是各大互联网公司创始人大佬&#xff0c;用文字记录下互联网江湖的风云变化。他&#xff0c;是魔都top大学的工业机器人博士&#xff0c;像谢尔顿一样充满科学的奇思妙想…

数据库拆分字符串函数_PHP | 不使用库函数将逗号分隔的字符串拆分为数组

数据库拆分字符串函数Given a string with comma delimited, we have to split it into an array. 给定一个以逗号分隔的字符串&#xff0c;我们必须将其拆分为一个数组。 Example: 例&#xff1a; Input: "Google,Bing,Yahoo!,DuckDuckGo"Output:arrar of strings…

arduino 休眠 节能_Arduino低功耗掉电模式看门狗唤醒

&#xfeff;最近在做一个低功耗的设备&#xff0c;发射红外来检测前面1米以内左右的地方是否有人&#xff0c;纽扣电池供电&#xff0c;需要持续工作至少两年&#xff0c;因此&#xff0c;要求设备工作电流在ua级别。(1)红外发射接收由于一般的红外发射接收(下图所示)都会比较…

Android-Dialog

Android-AlertView 我的地址&#xff1a;https://github.com/kongqw/Android-AlertView 开源地址&#xff1a;https://github.com/saiwu-bigkoo/Android-AlertView

mysql卸载后重装失败_小筑教育BIM课堂-Revit100问 [第二期] | 软件卸载

1、Revit未卸载干净&#xff0c;导致安装失败&#xff0c;怎么办&#xff1f;答&#xff1a;方法1&#xff1a;利用官方软件卸载工具UninstallTool软件将剩余残留未卸载子程序卸载干净&#xff0c;之后再安装Revit。方法2&#xff1a;如果UninstallTool软件检索不到电脑上还有相…

hdu 5631 Rikka with Graph(图)

n个点最少要n-1条边才能连通&#xff0c;可以删除一条边&#xff0c;最多删除2条边&#xff0c;然后枚举删除的1条边或2条边&#xff0c;用并查集判断是否连通&#xff0c;时间复杂度为O&#xff08;n^3&#xff09; 这边犯了个错误&#xff0c; for(int i0;i<N;i){ fa[i]i;…

电机编码器调零步骤_蒂森电梯编码器整定和主机整定大全

CT 编码器整定操作步骤1. 断开电源&#xff0c;吊起轿厢&#xff0c;空开曳引轮钢丝绳。2. 取出主板 JP5 的 9 与 10.11.13 的线并短接一起。3. 送电后确认 KAS,KAD,继电器吸合&#xff0c;接触器 KM1,KM2,KM3 也吸合&#xff0c;抱闸自动张开。注&#xff1a;保证安全回路 102…