微信支付

APP端开发步骤(传送门):https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=8_5


1.首先下载最新的微信支付的SDK包.下载地址:https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=11_1,拖到你的工程文件中.

简要步骤如下:

1.配置APPID

APPID要在微信开放平台申请.(让公司去注册.)

targets -> info -> URL Types

配置APPID.png

配置完是这样的

identifier 要使用 "weixin"

aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAIAAACQd1PeAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyBpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMC1jMDYwIDYxLjEzNDc3NywgMjAxMC8wMi8xMi0xNzozMjowMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNSBXaW5kb3dzIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOkJDQzA1MTVGNkE2MjExRTRBRjEzODVCM0Q0NEVFMjFBIiB4bXBNTTpEb2N1bWVudElEPSJ4bXAuZGlkOkJDQzA1MTYwNkE2MjExRTRBRjEzODVCM0Q0NEVFMjFBIj4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6QkNDMDUxNUQ2QTYyMTFFNEFGMTM4NUIzRDQ0RUUyMUEiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6QkNDMDUxNUU2QTYyMTFFNEFGMTM4NUIzRDQ0RUUyMUEiLz4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz6p+a6fAAAAD0lEQVR42mJ89/Y1QIABAAWXAsgVS/hWAAAAAElFTkSuQmCC" alt="" data-ratio="0.22193548387096773" data-src="http://mmbiz.qpic.cn/mmbiz_jpg/g4uoJOMA38IOQsHHYT5cjgI3XHdZm7Y9NVV87dD42WmUgbBg6fTQO26ibicfzXRK4gjgoW0zkmAuDOibVX1b4QM0Q/0?wx_fmt=jpeg" data-type="jpeg" data-w="775" />

配置APPID2.png

2.在appDelegate引入微信lib,和头文件.

#import "WXApi.h"#import "WXApiManager.h"
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {    //向微信注册APPID    
   [WXApi registerApp:@"wxb4ba3c02aa476ea1" withDescription:@"demo 2.0"];    return YES;
}

3.调起微信支付

微信支付需第一次调通统一下单接口 prepayId,sign,nonceStr,timeStamp分别是微信预支付ID,签名,随机字符串,还有时间戳.

建议 "统一下单"由服务器端调用,然后客户端调用 支付接口.
因为 客户端生成随机字符串,还有签名,终端ip等等在客户端做并不妥当,并且一些商品的描述信息,商户的订单号还是要从服务器那边获取.

- (void)wxPay{    
   NSString *res = [self jumpToBizPay];    
   if( ![@"" isEqual:res] ){        
       UIAlertView *alter = [[UIAlertView alloc] initWithTitle:@"支付失败" message:res delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil];          
       [alter show];    
   }
}
- (NSString *)jumpToBizPay {    //============================================================    
   // V3&V4支付流程实现    
   // 注意:参数配置请查看服务器端Demo    
   // 更新时间:2015年11月20日    
   //============================================================//    self.wxPayURL = @"http://wxpay.weixin.qq.com/pub_v2/app/app_pay.php?plat=ios";    
   //解析服务端返回json数据    
   NSError *error;    //加载一个NSURL对象    
   NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:self.wxPayURL]];    //将请求的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(@"url:%@",self.wxPayURL);        
       if(dict != nil){            
           NSMutableString *retcode = [dict objectForKey:@"retcode"];            
           if (retcode.intValue == 0){                
               NSMutableString *stamp  = [dict objectForKey:@"timestamp"];                //调起微信支付                
               PayReq* req             = [[PayReq alloc] init];                
               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=%@",[dict objectForKey:@"appid"],req.partnerId,req.prepayId,req.nonceStr,(long)req.timeStamp,req.package,req.sign );                return @"";            
            }else{                
                return [dict objectForKey:@"retmsg"];            
            }        
       }else{            
           return @"服务器返回错误,未获取到json对象";        
       }    
   }else{        
       return @"服务器返回错误";    
   }
}

这里注意: 一大堆代码都是为了获取 到这些参数.这里的代码是微信返回的参数,实际参数我们可以从公司服务器中请求接口获取.

PayReq* req             = [[PayReq alloc] init];    
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"];

字段 package 暂时是固定的 @"Sign=WXPay"就行.partnerId 是微信支付分配的商户号 申请的时候就有的.固定即可

获取完成之后调用

[WXApi sendReq:req];

剩下的就只有支付结果的回调了.

请求参数列表:

aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAIAAACQd1PeAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyBpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMC1jMDYwIDYxLjEzNDc3NywgMjAxMC8wMi8xMi0xNzozMjowMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNSBXaW5kb3dzIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOkJDQzA1MTVGNkE2MjExRTRBRjEzODVCM0Q0NEVFMjFBIiB4bXBNTTpEb2N1bWVudElEPSJ4bXAuZGlkOkJDQzA1MTYwNkE2MjExRTRBRjEzODVCM0Q0NEVFMjFBIj4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6QkNDMDUxNUQ2QTYyMTFFNEFGMTM4NUIzRDQ0RUUyMUEiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6QkNDMDUxNUU2QTYyMTFFNEFGMTM4NUIzRDQ0RUUyMUEiLz4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz6p+a6fAAAAD0lEQVR42mJ89/Y1QIABAAWXAsgVS/hWAAAAAElFTkSuQmCC" alt="" data-ratio="0.7661290322580645" data-src="http://mmbiz.qpic.cn/mmbiz_jpg/g4uoJOMA38IOQsHHYT5cjgI3XHdZm7Y9ic23ia1JHTQrCy6xGyJV2f9ibzzC2XpV7jMseicPjHId5GD6PaKS72coicw/0?wx_fmt=jpeg" data-type="jpeg" data-w="1240" />

请求参数列表.png

4.支付回调结果

a.回到 appDelegate中
遵循代理

@interface AppDelegate () <WXApiDelegate>

b.当调用微信支付返回的时候.我们做的就是要在

- (BOOL) application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation
判断是否成功调起微信支付.

- (BOOL) application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation{    BOOL result = [WXApi handleOpenURL:url delegate:self]; //判断调起微信支付是否成功    
   if (result) {        
       return result;    
   }    
   return NO;  
}

c.实现代理方法

/**  
*  微信的回调. (代理方法.)  
*/
-(void) onResp:(BaseResp*)resp{    
   if([resp isKindOfClass:[SendMessageToWXResp class]]){        
       strTitle = [NSString stringWithFormat:@"发送媒体消息结果"];    
   }    
   if([resp isKindOfClass:[PayResp class]]){        
       //支付返回结果,实际支付结果需要去微信服务器端查询        
       strTitle = [NSString stringWithFormat:@"支付结果"];        //控制器接收通知就OK!        
       switch (resp.errCode) {            
           case WXSuccess:{                
               strMsg = @"支付结果:成功!";   //微信文档有提到 一定不能用客户端的返回值做标准,实际支付结果应该去服务器查询的结果为准.                  
               [[NSNotificationCenter defaultCenter] postNotificationName:@"WXPaySuccess" object:@"success"];                
               break;            
            }            
           default:{                
                NSLog(@"错误,retcode = %d, retstr = %@", resp.errCode,resp.errStr);                //                
                [[NSNotificationCenter defaultCenter] postNotificationName:@"WXPayFailed" object:@"fail"];                
               break;            
           }        
       }    
   }  
}

支付回调结果,应该在去服务器查询.安全起见 结果一致,才显示支付成功! (有一些没说明清楚的麻烦指正.)
这里还是有一个坑的,微信会向服务器在固定的频率发送支付成功的回调,有可能 2s, 有可能3秒这样的.也就是说,支付成功之后回来的时候从服务器查询可能还残留着上一次的支付状态.(没有更新过来,需要缓几秒). 在这个频率之间去请求的话可能会出现结果不一致的情况.而且我觉得微信做的支付并不专业,用过其他几个支付平台的就知道,支付结果的回调的时候,会反回一些 有关的订单信息,或者订单状态等.以供查询,而微信只返回了一些状态码,如果还想查询其他信息话需要做另外的操作.

文/uncleRX(简书作者)
原文链接:http://www.jianshu.com/p/0782dcec99d7

微信支付-b的更多相关文章

  1. 【原创分享·微信支付】C# MVC 微信支付教程系列之现金红包

            微信支付教程系列之现金红包           最近最弄这个微信支付的功能,然后扫码.公众号支付,这些都做了,闲着无聊,就看了看微信支付的其他功能,发现还有一个叫“现金红包”的玩意,想 ...

  2. 【原创分享·微信支付】 C# MVC 微信支付教程系列之扫码支付

    微信支付教程系列之扫码支付                  今天,我们来一起探讨一下这个微信扫码支付.何为扫码支付呢?这里面,扫的码就是二维码了,就是我们经常扫一扫的那种二维码图片,例如,我们自己添 ...

  3. 【原创分享·微信支付】 C# MVC 微信支付教程系列之公众号支付

    微信支付教程系列之公众号支付         今天,我们接着讲微信支付的系列教程,前面,我们讲了这个微信红包和扫码支付.现在,我们讲讲这个公众号支付.公众号支付的应用环境常见的用户通过公众号,然后再通 ...

  4. 【原创分享·微信支付】C# MVC 微信支付之微信模板消息推送

    微信支付之微信模板消息推送                    今天我要跟大家分享的是“模板消息”的推送,这玩意呢,你说用途嘛,那还是真真的牛逼呐.原因在哪?就是因为它是依赖微信生存的呀,所以他能不 ...

  5. Android—基于微信开放平台v3SDK,开发微信支付填坑。

    接触微信支付之前听说过这是一个坑,,,心里已经有了准备...我以为我没准跳坑出不来了,没有想到我填上了,调用成功之后我感觉公司所有的同事都是漂亮的,隔着北京的大雾霾我仿佛看见了太阳~~~好了,装逼结束 ...

  6. 解决新版Android studio导入微信支付和支付宝官方Demo的问题

    最近项目要用到支付宝支付和微信支付,本想使用第三方支付框架ping++或者BeeCloud的,但是由于他们的收费问题,让我望而却步,而且公司给了相应的公钥.私钥和APPID等,所以就用下开放平台的呗. ...

  7. C#开发微信门户及应用(35)--微信支付之企业付款封装操作

    在前面几篇随笔,都是介绍微信支付及红包相关的内容,其实支付部分的内容还有很多,例如企业付款.公众号支付或刷卡支付.摇一摇红包.代金券等方面的内容,这些都是微信接口支持的内容,本篇继续微信支付这一主题, ...

  8. C#开发微信门户及应用(32)--微信支付接入和API封装使用

    在微信的应用上,微信支付是一个比较有用的部分,但也是比较复杂的技术要点,在微商大行其道的年代,自己的商店没有增加微信支付好像也说不过去,微信支付旨在为广大微信用户及商户提供更优质的支付服务,微信的支付 ...

  9. C#开发微信门户及应用(40)--使用微信JSAPI实现微信支付功能

    在我前面的几篇博客,有介绍了微信支付.微信红包.企业付款等各种和支付相关的操作,不过上面都是基于微信普通API的封装,本篇随笔继续微信支付这一主题,继续介绍基于微信网页JSAPI的方式发起的微信支付功 ...

  10. app使用微信支付成功后,点击返回到该app却跳到另外一个app去了

    刚接手了公司iOS的两个APP, 现在碰到了这样一个问题: 有一台iPhone在一个APP中使用了微信支付,支付成功后,点击返回到该APP,结果却跳到了另外一个APP去了. 这两个APP都是公司开发的 ...

随机推荐

  1. 关于搭建haddoop分布式系统的全部过程复习

    1\在vmware中更改了虚拟机的网络类型,--->NAT方式,(虚拟交换机的ip可以从vmvare的edit-->vertual network editor看到)2.根据这个交换机(网 ...

  2. 【转载】常用Maven插件介绍

    http://www.cnblogs.com/crazy-fox/archive/2012/02/09/2343722.html 我们都知道Maven本质上是一个插件框架,它的核心并不执行任何具体的构 ...

  3. 在VS2010中使用附加进程的方式调试IIS中的页面

    h3{background:#333333; } 准备篇-配置IIS环境 在发布网站之前,需要安装iis环境! 之后点击确定即可! 发布网站至IIS-附加到进程调试 1.       用VS2010将 ...

  4. Android Studio 快捷方式

    Alt+回车 导入包,自动修正 Ctrl+N 查找类 Ctrl+Shift+N 查找文件 Ctrl+Alt+L 格式化代码 Ctrl+Alt+O 优化导入的类和包 Alt+Insert 生成代码(如g ...

  5. Android Studio 创建aar包与引用

    两者区别:*.jar: 只包含了class文件与清单文件 ,不包含资源文件,如图片等所有res中的文件.*.aar: 包含所有资源 ,class以及res资源文件全部包含 一.创建aar包1.创建一个 ...

  6. Unity出现 error building player exception android (invocation failed)

    今天在编译Android的时候出现这个错误 error building player exception android (invocation failed) 百度谷歌之后,看到xuanyuson ...

  7. 函数 datediff(根据objid 获取同name 同年度最近的4条记录)

    显示 包括选择的这条,在加上 选择年度的此人 最近的 3条.(最多显示4条) . 记录数大于4条 . 全显示 create table temp( objid ,) primary key , nam ...

  8. Aliyun OSS SDK 异步分块上传导致应用异常退出

    问题描述: 使用Aliyun OSS SDK的BeginUploadPart/EndUploadPart执行异步分块上传操作,程序出现错误并异常退出! 原因分析: Using .NET Framewo ...

  9. 北大ACM(POJ1001-Exponentiation)

    Question:http://poj.org/problem?id=1001问题点:大数运算(求幂) #include <iostream> using namespace std; # ...

  10. ASP.NET中使用开源插件zTree的小结

    在最近的项目应用中,找到了zTree免费的好东西,这里总结一下: 源码下载:http://www.ztree.me/ 效果是酱紫的: 前台代码: 样式和脚本 <link rel="st ...