当前位置: 移动技术网 > IT编程>移动开发>IOS > iOS微信支付开发案例

iOS微信支付开发案例

2019年07月24日  | 移动技术网IT编程  | 我要评论

湖南移动通信,成人导航大全,电视之家

微信支付有很多坑的,官方提供的文档一点都不全面,而且demo也比较”羞涩”难懂。很多注意的细节都没有体现出来,走了很多弯路。于是,系统的开发流程如下。(完整的demo附在博客最后面)这里面包括微信支付开发和支付宝开发调用客户端的兼容处理。(两次签名放在移动端,博客中没提到没安装微信客户端的情况,也很简单[wxapi sendreq:request]调用这个方法的返回值为0即可判断。)

一、环境配置

1、首先是https协议访问,在plist设置白名单

这里写图片描述

2、当你工程中有微信分享、收藏、支付、登录等,需要在“info.plist”里增加如下代码(lsapplicationqueriesschemes)

这里写图片描述

3、解决bitcode编译不过问题

这里写图片描述

4、设置url types

这里写图片描述

5、导入sdk(可从微信官方的demo移植过来)

这里写图片描述

6、导入系统依赖库

这里写图片描述

7、特别要注意的是

微信支付是以分为单位的,也就是说,如果你支付金额是保留两位小数,支付的金额必须*100后再传给微信支付平台,其他的依次类推。

二、代码开发

1、在程序入口(即applegate.m)需要进行的操作

这里写图片描述

2、增加如下代理方法,否则不回调微信客服端(也是在delegate.m文件中)

这里写图片描述

3、微信支付成功的回调函数

这个有必要说明下,官方文档是这样说明的:不能以客服端支付成功的结果就直接当做是订单支付成功的结果,要以服务器返回的订单状态为准,也就是说,客服端支付成功后,微信支付平台会给服务器发送支付成功的消息,后台修改订单状态,重新返回给客户端。简单就是,支付成功要发送给特定的视图控制器(带有微信支付功能的视图控制器)发送通知,让这个特定的视图控制去请求服务器订单的住状态。这个回调函数必须写在delegate.m中!!!

4、特定视图控制器的代码(带有微信支付功能的视图控制器)
4.1 提交预支付订单获得预订单id(这个过程必须经过两次签名,分别是不带参数签名和携带参数签名,当然,这些方法都已经在payrequsesthandler类封装好了,你只需要传参数调用方法就可以了)这个也是点击支付按钮的动作方法

4.2得到预支付订单,那么就可以调微信支付的客服端(4.2和4.1代码是连续的)


附带sign参数签名的独立封装的两个方法,没用payrequsesthandler封装的方法,自己写的,因为用了出现问题(问题截图如下),先代码截图,后面再提供可直接复制黏贴的代码块
问题截图:(相信很多人遇到过,100%是sign签名的问题)

这里写图片描述 

方法一:

 

方法二:

这里写图片描述

4.3 上面的代码就可以完全解决微信支付问题,剩下最后一个步骤,支付成功返回app调用delegate的-(void)onresp:(baseresp*)resp方法,那么这里要发送通知给特定的视图控制器,让他去请求后台的订单状态。这里要说明的是,你从那个界面调的微信支付后,返回还是在原处。只是回调方法必须在delegate中,所以必须在回调方法发送成功的通知。那么要在特定的视图控制器的视图即将出现的方法中,监听到这个通知,然后请求后台的订单状态。这里需要注意的是,需要重写dealloc方法,移除通知。

这里写图片描述

三、支付宝和微信支付的回调客户端的代理方法的兼容处理

这里写图片描述

四、demo分享地址

可供复制黏贴的代码(sign签名)

-(nsstring )createmd5singforpay:(nsstring )appid_key partnerid:(nsstring)partnerid_key prepayid:(nsstring )prepayid_key package:(nsstring )package_key noncestr:(nsstring)noncestr_key timestamp:(uint32)timestamp_key 
{ 
nsmutabledictionary *signparams = [nsmutabledictionary dictionary]; 
[signparams setobject:appid_key forkey:@”appid”]; 
[signparams setobject:noncestr_key forkey:@”noncestr”]; 
[signparams setobject:package_key forkey:@”package”]; 
[signparams setobject:partnerid_key forkey:@”partnerid”]; 
[signparams setobject:prepayid_key forkey:@”prepayid”]; 
[signparams setobject:[nsstring stringwithformat:@”%u”,(unsigned int)timestamp_key] forkey:@”timestamp”];
nsmutablestring *contentstring =[nsmutablestring string]; 
nsarray *keys = [signparams allkeys]; 
//按字母顺序排序 
nsarray *sortedarray = [keys sortedarrayusingcomparator:^nscomparisonresult(id obj1, id obj2) {
return [obj1 compare:obj2 options:nsnumericsearch]; 
}]; 
//拼接字符串 
for (nsstring *categoryid in sortedarray) { 
if ( ![[signparams objectforkey:categoryid] isequaltostring:@”“] 
&& ![[signparams objectforkey:categoryid] isequaltostring:@”sign”] 
&& ![[signparams objectforkey:categoryid] isequaltostring:@”key”] 
) 
{ 
[contentstring appendformat:@”%@=%@&”, categoryid, [signparams objectforkey:categoryid]];
} 
} 
//添加商户密钥key字段 
[contentstring appendformat:@”key=%@”, @”这里填写商户密钥”]; 
nsstring *result = [self md5:contentstring]; 
return result;

}//创建发起支付时的sige签名

-(nsstring ) md5:(nsstring )str 
{ 
const char *cstr = [str utf8string]; 
unsigned char result[16]= “0123456789abcdef”; 
cc_md5(cstr, (cc_long)strlen(cstr), result); 
//这里的x是小写则产生的md5也是小写,x是大写则md5是大写,这里只能用大写,微信的大小写验证很逗 
return [nsstring stringwithformat: 
@”%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x”, 
result[0], result[1], result[2], result[3], 
result[4], result[5], result[6], result[7], 
result[8], result[9], result[10], result[11], 
result[12], result[13], result[14], result[15] 
]; 
}//md5 加密

微信支付下载demo:

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

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

  • ios uicollectionview实现横向滚动

    现在使用卡片效果的app很多,之前公司让实现一种卡片效果,就写了一篇关于实现卡片的文章。文章最后附有demo实现上我选择了使用uicollectionview ... [阅读全文]
  • iOS UICollectionView实现横向滑动

    本文实例为大家分享了ios uicollectionview实现横向滑动的具体代码,供大家参考,具体内容如下uicollectionview的横向滚动,目前我使... [阅读全文]
  • iOS13适配深色模式(Dark Mode)的实现

    iOS13适配深色模式(Dark Mode)的实现

    好像大概也许是一年前, mac os系统发布了深色模式外观, 看着挺刺激, 时至今日用着也还挺爽的终于, 随着iphone11等新手机的发售, ios 13系统... [阅读全文]
  • ios 使用xcode11 新建项目工程的步骤详解

    ios 使用xcode11 新建项目工程的步骤详解

    xcode11新建项目工程,新增了scenedelegate这个类,转而将原appdelegate负责的对ui生命周期的处理担子接了过来。故此可以理解为:ios... [阅读全文]
  • iOS实现转盘效果

    本文实例为大家分享了ios实现转盘效果的具体代码,供大家参考,具体内容如下demo下载地址: ios转盘效果功能:实现了常用的ios转盘效果,轮盘抽奖效果的实现... [阅读全文]
  • iOS开发实现转盘功能

    本文实例为大家分享了ios实现转盘功能的具体代码,供大家参考,具体内容如下今天给同学们讲解一下一个转盘选号的功能,直接上代码直接看viewcontroller#... [阅读全文]
  • iOS实现轮盘动态效果

    本文实例为大家分享了ios实现轮盘动态效果的具体代码,供大家参考,具体内容如下一个常用的绘图,主要用来打分之类的动画,效果如下。主要是ios的绘图和动画,本来想... [阅读全文]
  • iOS实现九宫格连线手势解锁

    本文实例为大家分享了ios实现九宫格连线手势解锁的具体代码,供大家参考,具体内容如下demo下载地址:效果图:核心代码://// clockview.m// 手... [阅读全文]
  • iOS实现卡片堆叠效果

    本文实例为大家分享了ios实现卡片堆叠效果的具体代码,供大家参考,具体内容如下如图,这就是最终效果。去年安卓5.0发布的时候,当我看到安卓全新的material... [阅读全文]
  • iOS利用余弦函数实现卡片浏览工具

    iOS利用余弦函数实现卡片浏览工具

    本文实例为大家分享了ios利用余弦函数实现卡片浏览工具的具体代码,供大家参考,具体内容如下一、实现效果通过拖拽屏幕实现卡片移动,左右两侧的卡片随着拖动变小,中间... [阅读全文]
验证码:
移动技术网