iOS中APP的支付最常见的有三种(支付宝,微信,银联)。这片博客先说下微信支付:

1.首先申请微信商家以及对应的平台等等,大多数APP已经在做微信支付的时候已经做了微信分享,所以在微信开放平台上的APP_ID,APP_KEY,APP_SECRET之类的拿来就能用,需要在商家平台上生成对应的密钥(微信支付商户密钥, 32位, 这个, 不是微信开放平台给提供的, 这个是需要自己提供的 ,自己百度密钥生成器),如果需要做批量退款之类的就牵扯到微信证书之类的。

2.把需要准备的账号信息弄好之后就下载对应的sdk然后导入自己的工程,在导入的工程中需要注意的是,lib文件夹全部导入工程,SDKExport文件夹下需要看你的项目,如果你已经做了微信分享(不管是友盟的还是share的)里面就有这个文件夹里的.a静态库以及两个.h文件就不需要再导入了,如果没有做分享就需要导入。另外就是MRC与ARC之间的转换。其他的话根据自己工程里的具体情况具体分析,每个人的工程都不一样。我就遇到了DeBug情况下自定义的NSLog输出行数的宏与Foundation的NSObjCRuntime中方法NSLog冲突的问题。不要怕一点一点找原因。

3.当导入工程成功之后就按照微信的文档首先在AppDelegate里注册微信[WXApiregisterApp:APP_IDwithDescription:@"demo 2.0"];写微信的代理方法-(void) onResp:(BaseResp*)resp(用来支付成功后回调的,直接从demo复制)然后在工程的info选项里URL Types里添加微信选项(这个不会可以参考官方文档),接下来开始配置基本的支付参数等等(根据自己情况来修改)

#define APP_ID          @"wx9999999999999"               //APPID

#define APP_SECRET @"f562ddddd4044b45f2ad642525ac258da" //appsecret //商户号,填写商户对应参数 #define MCH_ID @"123124344534" //商户API密钥,填写相应参数 #define PARTNER_ID @"asdasdsaddkgjhgafrwbmhfeudrgfzqfj" //支付结果回调页面 #define NOTIFY_URL @"http://<span style="font-family: Arial, Helvetica, sans-serif;">wxpay.weixin.qq.com</span><span style="font-family: Arial, Helvetica, sans-serif;">/forumWXPayReturn.html"</span> //获取服务器端支付数据地址(商户自定义)

define SP_URL @"http://wxpay.weixin.qq.com/pub_v2/app/app_pay.php&quot;

4.在需要支付的地方导入对应的头文件可参考官方文档,准备妥当(有些方法直接从demo里面复制)之后,看下微信的支付方法

- (void)sendPay
{//从服务器获取支付参数,服务端自定义处理逻辑和格式//订单标题NSString *ORDER_NAME    = @"Ios服务器端签名支付 测试";//订单金额,单位(元)NSString *ORDER_PRICE   = @"0.01";//根据服务器端编码确定是否转码NSStringEncoding enc;//if UTF8编码//enc = NSUTF8StringEncoding;//if GBK编码enc = CFStringConvertEncodingToNSStringEncoding(kCFStringEncodingGB_18030_2000);NSString *urlString = [NSString stringWithFormat:@"%@?plat=ios&order_no=%@&product_name=%@&order_price=%@",SP_URL,[[NSString stringWithFormat:@"%ld",time(0)] stringByAddingPercentEscapesUsingEncoding:enc],[ORDER_NAME stringByAddingPercentEscapesUsingEncoding:enc],ORDER_PRICE];//解析服务端返回json数据NSError *error;//加载一个NSURL对象NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:urlString]];//将请求的url数据放到NSData对象中NSData *response = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil];if ( response != nil) {NSMutableDictionary *dict = NULL;//IOS5自带解析类NSJSONSerialization从response中解析出数据放到字典中dict = [NSJSONSerialization JSONObjectWithData:response options:NSJSONReadingMutableLeaves error:&error];NSLog(@"%@",dict);NSLog(@"url:%@",urlString);if(dict != nil){NSMutableString *retcode = [dict objectForKey:@"retcode"];NSLog(@"retcode%@",retcode);if (retcode.intValue == 0){NSMutableString *stamp  = [dict objectForKey:@"timestamp"];//???//调起微信支付PayReq* req             = [[[PayReq alloc] init] autorelease];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对象"];}}else{[self alert:@"提示信息" msg:@"服务器返回错误"];}
}

微信的支付参数加密方式有两种,一种是自己将价格商品名字传入自己的后台然后后台返回你对应的参数(相对安全),一种是本地的参数加密,上面的方法是支付参数上传后台的方法,我用的是本地加密支付参数的方法,接下来看本地支付参数加密对应的支付方法:

- (void)sendPay
{if ([WXApi isWXAppInstalled]) {//检查是否安装微信NSLog(@"开始微信支付");//微信支付payRequsestHandler *payHandler = [[payRequsestHandler alloc] init];[payHandler init:APP_ID mch_id:MCH_ID];[payHandler setKey:PARTNER_ID];//        NSMutableDictionary *dic = [payHandler sendPay_demoWithProductName:@"萝卜" price:@"1" deviceInfo:@"APP-001"];//返回支付数据NSMutableDictionary *dic = [payHandler sendPay_demo];//发起支付if (dic) {PayReq *request = [[PayReq alloc] init];request.openID = dic[@"appid"];request.partnerId = dic[@"partnerid"];request.prepayId = dic[@"prepayid"];request.package = dic[@"package"];request.nonceStr = dic[@"noncestr"];request.timeStamp = [dic[@"timestamp"] intValue];request.sign = dic[@"sign"];//日志输出NSLog(@"appid=%@\npartid=%@\nprepayid=%@\nnoncestr=%@\ntimestamp=%ld\npackage=%@\nsign=%@",request.openID,request.partnerId,request.prepayId,request.nonceStr,(long)request.timeStamp,request.package,request.sign );[WXApi sendReq:request];}} else {UIAlertController *alertC = [UIAlertController alertControllerWithTitle:nil message:@"设备没有安装微信" preferredStyle:(UIAlertControllerStyleAlert)];[alertC addAction:[UIAlertAction actionWithTitle:@"取消" style:(UIAlertActionStyleCancel) handler:nil]];[alertC addAction:[UIAlertAction actionWithTitle:@"安装" style:(UIAlertActionStyleDefault) handler:^(UIAlertAction *action) {[[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"http://itunes.apple.com/cn/app/wei-xin/id414478124?mt=8"]];}]];
//        [self presentViewController:alertC animated:YES completion:nil];}
}

然后看lib文件夹下 payRequsestHandler类中加密的方法,这个地方需要修改一下sendPay_demo 放法把商品名字和价格传进去,然后查看下对应的参数是否都按照自己的工程对应,支付方法就完成了。

5.回调方法,当支付完成后需要一个回调方法来刷新数据或者做一些其他的事情,微信的回调方法是

//支付完成之后回调方法,可更新数据
-(void) onResp:(BaseResp*)resp
{NSString *strMsg = [NSString stringWithFormat:@"errcode:%d", resp.errCode];NSString *strTitle;//SendMessageToWXResp类需根据具体情况修改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];[alert release];
}

自己可根据情况具体修改。然后就可以测试你的支付了。想要深层次的学习 就需要自己看下官方文档和示例demo。另外如果手机没有安装微信客户端的情况下,不要提示用户去安装,因为可能遇到审核的人不小心把你的应用拒了。

iOS开发之微信支付相关推荐

  1. 苹果手机 微信PHP问题,安卓、ios APP调用微信支付时,页面出现空白 。(php微信支付,app发起微信支付白屏)?...

    安卓.ios APP调用微信支付时,页面出现空白 我的后端是用php开发的.我是先调用微信的统一下单生成,生成prepay_id预支付订单号,代码如下: public function send_pa ...

  2. iOS 苹果手机客户端微信支付调起失败--无法调起微信的原因

    1. iOS 苹果手机客户端微信支付调起失败–无法调起微信的原因 微信的SDK分两种,一种包含支付的SDK,另一中是不包含支付的SDK, 因为项目早期集成的是微信分享的SDK,不带支付的功能,所以更换 ...

  3. ##iOS中的微信支付 支付验证签名失败

    iOS中的微信支付 支付验证签名失败 今天要在项目中添加微信支付,iOS端的所有东西都已经按照文档搞好了,可就是跳转到微信的时候显示"支付验证签名失败",可是安卓端的都没有问题,就 ...

  4. iOS开发-类似微信录音上滑取消功能

    iOS开发-类似微信录音上滑取消功能 前言 效果 代码 先自定义UIButton 使用 监听上下滑动代码 前言 在社交媒体中开发中遇到需要做类似微信录音上滑取消功能,例子,虽然不是很好看,但是细节满满 ...

  5. 微信小程序开发实现微信支付

    微信支付是时下最流行的交易支付方法之一,潜移默化推动着无现今社会的变革.小程序作为微信上的轻应用,同时也开放微信支付的接口,可以通过转账,扫二维码支付.要完成一次具体的订单支付需要完整的支付流程,具体 ...

  6. 微信小程序使用云开发实现微信支付功能 报错Error: 签名错误,史上最全解决办法,不服留言骂我

    报错背景 微信小程序使用云开发实现微信支付功能,但是报错了 报错信息 报错原因 小程序想要使用微信支付,必须满足下面几个条件的 1,必须是非个人小程序(个人小程序用不了支付) 企业小程序需要认证! 2 ...

  7. Android支付宝错误码62009,hb混合开发app 微信支付提示支付宝62009未知错误

    问题描述 hb混合开发app 微信支付提示支付宝62009未知错误 问题出现的环境背景及自己尝试过哪些方法 真机模拟测试 相关代码 获取通道 mounted(){ plus.payment.getCh ...

  8. iOS开发通过微信学习WCDB(二)

      通过<iOS开发通过微信学习WCDB(一)>这篇博客,相信大家对WCDB已经有了一个简单的了解和认识.这篇文章主要是为了进一步深入的学习 ###数据库加密   上篇文章中提到了,自己在 ...

  9. iOS WKWebView H5微信支付跳转

    iOS WKWebView H5微信支付跳转 需求:iOS客户端实现嵌入H5进行微信支付跳转到微信客户端,支付完成后再跳转回我们的APP,解决WKWebView无法跳转回APP的BUG. 阅读前提: ...

最新文章

  1. 身份证号码的正则表达式及验证详解(JavaScript,Regex)
  2. CVPR 2021 妆容迁移 CPM SCGAN
  3. 《HTML5移动应用开发入门经典》—— 1.1 了解HTML5的由来
  4. Java中 Iterable 和 Iterator 的区别
  5. ActionScript 3.0 API 中的 Video 类
  6. live555 源代码简单分析1:主程序
  7. 基于Android语言的通信调试助手实现(TCP协议+Socket编程)
  8. DMX协议和RDM协议
  9. Android之ANR
  10. struct files_struct和struct fdtable
  11. Codility每周一课:P8.2 Dominator
  12. 选择视频直播SDK的4项技术指标,5项基本能力
  13. JS 判断 IE 浏览器版本
  14. 连续函数原函数(不定积分)存在定理证明
  15. 计算机画图学生作品小学,小学电脑绘画作品的指导
  16. 从做深基础,曝光正在“变硬”的阿里云
  17. STM32 TIM1输入捕获测试输入信号的频率
  18. div里嵌套div设置不换行的方法
  19. HDU-1172 猜数字
  20. tensorflow 图片批处理--- tf.train.batch

热门文章

  1. java 懒汉模式以及饿汉模式
  2. Jedispool单例模式的最佳实践
  3. 微商怎么做推广?18个微商推广技巧告诉你
  4. Linux中redis主从配置
  5. QGIS编译SIP的问题
  6. 常见的Nginx优化项
  7. VSCode切换终端Shell 让VSCode终端直接显示分支名称
  8. js 获取自适应高度div的高度
  9. 在CLI中打印表格----gotable使用介绍
  10. 针对公共安全的GIS技术应用详情