iOS--->微信支付小结
iOS--->微信支付小结
说起支付,除了支付宝支付之外,微信支付也是我们三方支付中最重要的方式之一,承接上面总结的支付宝,接下来把微信支付也总结了一下
***那么首先还是由公司去创建并申请使用微信支付所需的信息
1.接下来就是微信支付的集成步骤了,参考着开发文档来,非常简单的 下载SDK,项目中导入所需的文件WxPay文件夹中,注意其中的.a文件容易丢失
2.根据文档对其中支持的非arc进行设置
3.设置微信支付的URL types
4.接下来就是代码内部的事情了,做支付我们知道首先需要在appdelegate中设置相应的属性
-(BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
//微信支付配置 自己申请注册的
[WXApi registerApp:@"wx0e65e1b96577f407" withDescription:@"demo 2.0"];
return YES;
}
//微信支付界面 onResp函数回调界面
//处理微信通过URL,启动App时传递的数据
-(BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url{
return [WXApi handleOpenURL:url delegate:self];
}
说到支付,那么支付结果的回调是必不可少的,还是在appdelegate页面
//微信支付返回 回调
-(void)onResp:(BaseResp*)resp{
NSLog(@"tets");
NSInteger num=0;
if ([resp isKindOfClass:[PayResp class]]){
PayResp*response=(PayResp*)resp;
switch(response.errCode){
case WXSuccess:
{
num=1;
//服务器端查询支付通知或查询API返回的结果再提示成功
NSLog(@"支付成功");
// [self weixinzhifuhuidiao:1];
break;
}
case WXErrCodeUserCancel:
{
num=2;
NSLog(@"cewsgu");
// [self weixinzhifuhuidiao:2];
}
break;
default:
num=3;
// [self weixinzhifuhuidiao:3];
NSLog(@"支付失败,retcode=%d",resp.errCode);
break;
}
}
}
最后就不说闲话了,直接在支付页面上代码参考官方Demo即可(貌似官方有两种方式,这里仅使用其中一种)
#pragma mark --------- 微信支付 demo ---------
-(void)setWeixinSuccessString:(NSString *)weixinSuccessString{
_weixinSuccessString=weixinSuccessString;
[SVProgressHUD showWithStatus:@"正在提交预支付信息"];
GRWDDDRequest * request=[[GRWDDDRequest alloc]init];
[request weixinyuzhifuWithString:weixinyuazhifURL parems:@{@"Income":@(_totalprice),@"OrderNo":_dataDict[@"orderNo"]} success:^(id data) {
NSDictionary * dict=[NSJSONSerialization JSONObjectWithData:data options:0 error:nil];
if ([dict[@"Result"] floatValue] == 1) {
NSString * message = [NSString stringWithFormat:@"订单号:%@\r总支付价格:%0.2f元",_dataDict[@"orderNo"],_totalprice];
UIAlertView * alertView=[[UIAlertView alloc]initWithTitle:@"微信支付信息" message:message delegate:self cancelButtonTitle:@"确定" otherButtonTitles:@"取消", nil];
alertView.delegate=self;
alertView.tag=2015;
[alertView show];
_weixinDict=dict[@"Data"];
}else{
UIAlertView * alertView=[[UIAlertView alloc]initWithTitle:@"支付失败" message:dict[@"Data"] delegate:self cancelButtonTitle:@"确定" otherButtonTitles:nil, nil];
[alertView show];
}
[SVProgressHUD dismiss];
} fail:^(NSError *error) {
[SVProgressHUD dismiss];
}];
}
// 请求回调微信支付
-(void)sendzhifu{
_dict =[NSDictionary dictionary];
_dict = [self qianming:_weixinDict];
PayReq *request = [[PayReq alloc] init];
request.partnerId = _dict[@"partnerid"];
request.prepayId= _dict[@"prepayid"];
request.package = _dict[@"package"];
request.nonceStr= _dict[@"noncestr"];
request.timeStamp= (UInt32)[_dict[@"timestamp"] integerValue];
request.sign= _dict[@"sign"];
[WXApi sendReq:request];
}
-(NSDictionary *)qianming:(NSDictionary *)ttdict{
payRequsestHandler * handler = [[payRequsestHandler alloc]init];
[handler init:@"wx0e65e1b96577f407" mch_id:@"1265805801"];
[handler setKey:@"CLSH1984AWST1982weixinapihd2015t"];
NSString *prePayid;
prePayid = ttdict[@"prepayid"];
if ( prePayid != nil) {
//获取到prepayid后进行第二次签名
NSString *package, *time_stamp, *nonce_str;
//设置支付参数
time_t now;
time(&now);
time_stamp = [NSString stringWithFormat:@"%ld", now];
nonce_str = [WXUtil md5:time_stamp];
//重新按提交格式组包,微信客户端暂只支持package=Sign=WXPay格式,须考虑升级后支持携带package具体参数的情况
//package = [NSString stringWithFormat:@"Sign=%@",package];
package = @"Sign=WXPay";
//第二次签名参数列表
NSMutableDictionary *signParams = [NSMutableDictionary dictionary];
[signParams setObject: ttdict[@"appId"] forKey:@"appid"];
[signParams setObject: nonce_str forKey:@"noncestr"];
[signParams setObject: package forKey:@"package"];
[signParams setObject: ttdict[@"partnerid"] forKey:@"partnerid"];
[signParams setObject: time_stamp forKey:@"timestamp"];
[signParams setObject: ttdict[@"prepayid"] forKey:@"prepayid"];
//[signParams setObject: @"MD5" forKey:@"signType"];
//生成签名
NSString *sign = [handler createMd5Sign:signParams];
//添加签名
[signParams setObject: sign forKey:@"sign"];
NSLog(@"*****%@ ******",sign);
//返回参数列表
return signParams;
}
else{
return nil;
}
return nil;
}
//微信支付返回 回调
-(void)onResp:(BaseResp*)resp{
NSLog(@"判断是否执行此路径 **** %@ **** %@",_orderNoLabel.text,_dataDict[@"orderNo"]);
self.ceshixiancheng=@"";
if ([resp isKindOfClass:[PayResp class]]){
PayResp*response=(PayResp*)resp;
switch(response.errCode){
case WXSuccess:
{
//服务器端查询支付通知或查询API返回的结果再提示成功
NSLog(@"支付成功");
break;
}
case WXErrCodeUserCancel:
{
}
break;
default:
NSLog(@"支付失败,retcode=%d",resp.errCode);
break;
}
}
}
//微信支付结果 二次确认
-(void)weixinzhifuhuidiao:(NSInteger)state{
NSUserDefaults * userDefaults=[NSUserDefaults standardUserDefaults];
NSDictionary * userDict=[userDefaults valueForKey:@"login"];
[SVProgressHUD showWithStatus:@"正在核对支付信息,请稍等……"];
GRWDDDRequest * request=[[GRWDDDRequest alloc]init];
[request weixinzhifujieguoWithString:weixinzhifujieguoURL parems:@{@"orderno":_dataDict[@"orderNo"],@"payno":_weixinDict[@"payNo"],@"state":@(state),@"menberId":userDict[@"Data"][@"Id"]} success:^(id data) {
NSDictionary * dict=[NSJSONSerialization JSONObjectWithData:data options:0 error:nil];
if ([dict[@"Result"] integerValue] == 1) {
[SVProgressHUD showSuccessWithStatus:dict[@"Data"]];
[self.navigationController popViewControllerAnimated:YES];
}else{
[SVProgressHUD showErrorWithStatus:dict[@"Data"]];
}
NSLog(@"%@",dict);
} fail:^(NSError *error) {
[SVProgressHUD dismiss];
}];
}
到这里微信支付也就结束了,其他的就是解决问题了,集成的过程中出现错误不可避免,解决即可
1>启动后,出现闪退现象:检查签名是否正确(需要二次签名),在URL Schemes中检查是否正确添加了微信appid,检查你是否注册了appid
***最普遍的错误就是:sign字段,必须要自己生成的
ps:我刚开始时出现了很多错误,然而查也没找到答案,总后用了神技:删除重新集成一遍,然后就这样默默地成功了。。。其实我也不知道为什么,有时候实在没办法,那就重新加一遍,说不定可以解决呢!!!!
iOS--->微信支付小结的更多相关文章
- iOS微信支付集成
概述 iOS微信支付集成 详细 代码下载:http://www.demodashi.com/demo/10735.html 支付宝和微信都是业界的老大哥,相信大家都有所觉得文档.SDK都是各种坑吧(纯 ...
- iOS微信支付无法直接返回APP的问题
最近新测个项目,发现在IOS手机的APP上使用微信支付无法直接返回APP. 咨询微信客服,了解到无法直接返回APP的原因是收款配置的APPID为合作商家的APPID,而不是公司APP的APPID. 当 ...
- iOS 微信支付总结
1.支付流程 https://pay.weixin.qq.com/wiki/doc/api/app.php?chapter=8_3 商户系统和微信支付系统主要交互说明: 步骤1:用户在商户APP中选择 ...
- iOS 微信支付
相关资料 SDK下载:https://pay.weixin.qq.com/wiki/doc/api/app.php?chapter=11_1 APP端开发步骤说明:https://pay.weixin ...
- iOS微信支付
SDK接入 服务器签名版本 官方已经是建议使用服务器签名来接入微信支付,实际上从安全上考虑,确实是每个客户端不应该知道RAS密钥,也不需要每个客户端都写一遍签名的算法. 服务端接入流程文档:https ...
- ios微信支付成功后点击左上角返回不走回调的问题
最近做微信支付发现ios9以后出现的跳转其他app后左上角有返回xxx功能会影响微信支付回调,情况如图 返回后不走下面的方法 - (BOOL)application:(UIApplication *) ...
- iOS 微信支付流程详解
背景 自微信支付.支付宝支付入世以来,移动端的支付日渐火热.虚拟货币有取代实体货币的趋向(这句纯属扯淡,不用管),支付在app开发中是一项基本的功能,有必要去掌握.从难易程度上讲,不管是微信支付还是支 ...
- ios微信支付 v3
V2版本和V3版本存在很大的差异. 1. 从成功通过微信支付商户的资料审核返回的邮件开始: 你可以获得这些参数 appid,appSecret,partnerID, partnerKey(从平 ...
- iOS微信支付demo运行报错解决如下
要接入微信支付的小伙伴,首先要下载一份官方demo(APP微信支付官方Demo下载),然后打开工程,准备大干一场. 1.编译报错 编译的时候居然直接报错了(orz) 错误提示: APP微信支付官方De ...
- iOS 微信支付SDK与微信友盟分享两者同时集成时,出现的问题与解决之路。
这两天改版一个旧的APP,要旧貌换新颜,拿到app后进行编译,一直报下面的错误. 报不认识的符号名PayReq错误.奇怪,啥也没动就这样,真不知道给的包是不是本来就是个报错的工程. 不管怎样,要对它修 ...
随机推荐
- PHP-生成缩略图和添加水印图-学习笔记
1.开始 在网站上传图片过程,经常用到缩略图功能.这里我自己写了一个图片处理的Image类,能生成缩略图,并且可以添加水印图. 2.如何生成缩略图 生成缩略图,关键的是如何计算缩放比率. 这里,我根据 ...
- MIP开发常见问题解答
校验相关 1. MIP 页面的 <a>链接校验报错,MIP 是强制 target="_blank" 吗? 如果想直接跳转MIP页,可以用mip-link 组件:MIP ...
- 利用bootstrap的carousel.js实现轮播图动画
前期准备: 1.jquery.js. 2.bootstrap的carousel.js. 3.bootstrap.css. 如果大家不知道在哪下载,可以联系小颖,小颖把这些js和css可以发送给你. 一 ...
- android通过webview调起支付宝app支付
webview在加载网页的时候会默认调起手机自带的浏览器加载网页,用户体验不好.但当用户设置浏览器客户端(setWebViewClient)设置这样的监听事件之后,当请求url的时候就不会打开手机自带 ...
- RabbitMq应用一
RabbitMq应用一 RabbitMQ的具体概念,百度百科一下,我这里说一下我的理解,如果有少或者不对的地方,欢迎纠正和补充. 一个项目架构,小的时候,一般都是传统的单一网站系统,或者项目,三层架构 ...
- ThinkPHP 模板substr的截取字符串函数
ThinkPHP 模板substr的截取字符串函数在Common/function.php加上以下代码 /** ** 截取中文字符串 **/ function msubstr($str, $start ...
- GJM : C#设计模式(1)——单例模式
感谢您的阅读.喜欢的.有用的就请大哥大嫂们高抬贵手"推荐一下"吧!你的精神支持是博主强大的写作动力以及转载收藏动力.欢迎转载! 版权声明:本文原创发表于 [请点击连接前往] ,未经 ...
- JavaScript将字符串中的每一个单词的第一个字母变为大写其余均为小写
要求: 确保字符串的每个单词首字母都大写,其余部分小写. 这里我自己写了两种方法,或者说是一种方法,另一个是该方法的变种. 第一种: function titleCase(str) { var new ...
- BPM合同管理解决方案分享
一.方案概述合同是组织与组织间所订协议的法律 表现形式,体现着双方对于合作在法律和道德上的承诺.然而,大多数企业的合同管理都或多或少存在合同审批过程不规范.签订草率.审批权责不清.合同执行跟踪难.合同 ...
- Hibernatel框架基础使用
Hibernatel框架基础使用 1.简介 1.1.Hibernate框架由来 Struts:基于MVC模式的应用层框架技术 Hibernate:基于持久层的框架(数据访问层使用)! Spring:创 ...