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--->微信支付小结的更多相关文章

  1. iOS微信支付集成

    概述 iOS微信支付集成 详细 代码下载:http://www.demodashi.com/demo/10735.html 支付宝和微信都是业界的老大哥,相信大家都有所觉得文档.SDK都是各种坑吧(纯 ...

  2. iOS微信支付无法直接返回APP的问题

    最近新测个项目,发现在IOS手机的APP上使用微信支付无法直接返回APP. 咨询微信客服,了解到无法直接返回APP的原因是收款配置的APPID为合作商家的APPID,而不是公司APP的APPID. 当 ...

  3. iOS 微信支付总结

    1.支付流程 https://pay.weixin.qq.com/wiki/doc/api/app.php?chapter=8_3 商户系统和微信支付系统主要交互说明: 步骤1:用户在商户APP中选择 ...

  4. iOS 微信支付

    相关资料 SDK下载:https://pay.weixin.qq.com/wiki/doc/api/app.php?chapter=11_1 APP端开发步骤说明:https://pay.weixin ...

  5. iOS微信支付

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

  6. ios微信支付成功后点击左上角返回不走回调的问题

    最近做微信支付发现ios9以后出现的跳转其他app后左上角有返回xxx功能会影响微信支付回调,情况如图 返回后不走下面的方法 - (BOOL)application:(UIApplication *) ...

  7. iOS 微信支付流程详解

    背景 自微信支付.支付宝支付入世以来,移动端的支付日渐火热.虚拟货币有取代实体货币的趋向(这句纯属扯淡,不用管),支付在app开发中是一项基本的功能,有必要去掌握.从难易程度上讲,不管是微信支付还是支 ...

  8. ios微信支付 v3

    V2版本和V3版本存在很大的差异. 1. 从成功通过微信支付商户的资料审核返回的邮件开始: 你可以获得这些参数  appid,appSecret,partnerID,    partnerKey(从平 ...

  9. iOS微信支付demo运行报错解决如下

    要接入微信支付的小伙伴,首先要下载一份官方demo(APP微信支付官方Demo下载),然后打开工程,准备大干一场. 1.编译报错 编译的时候居然直接报错了(orz) 错误提示: APP微信支付官方De ...

  10. iOS 微信支付SDK与微信友盟分享两者同时集成时,出现的问题与解决之路。

    这两天改版一个旧的APP,要旧貌换新颜,拿到app后进行编译,一直报下面的错误. 报不认识的符号名PayReq错误.奇怪,啥也没动就这样,真不知道给的包是不是本来就是个报错的工程. 不管怎样,要对它修 ...

随机推荐

  1. Angular2入门系列教程6-路由(二)-使用多层级路由并在在路由中传递复杂参数

    上一篇:Angular2入门系列教程5-路由(一)-使用简单的路由并在在路由中传递参数 之前介绍了简单的路由以及传参,这篇文章我们将要学习复杂一些的路由以及传递其他附加参数.一个好的路由系统可以使我们 ...

  2. MySQL高级知识- MySQL的架构介绍

    [TOC] 1.MySQL 简介 概述 MySQL是一个关系型数据库管理系统,由瑞典MySQL AB公司开发,目前属于Oracle公司. MySQL是一种关联数据库管理系统,将数据保存在不同的表中,而 ...

  3. .NET Core中间件的注册和管道的构建(2)---- 用UseMiddleware扩展方法注册中间件类

    .NET Core中间件的注册和管道的构建(2)---- 用UseMiddleware扩展方法注册中间件类 0x00 为什么要引入扩展方法 有的中间件功能比较简单,有的则比较复杂,并且依赖其它组件.除 ...

  4. 如何优雅的使用RabbitMQ

    RabbitMQ无疑是目前最流行的消息队列之一,对各种语言环境的支持也很丰富,作为一个.NET developer有必要学习和了解这一工具.消息队列的使用场景大概有3种: 1.系统集成,分布式系统的设 ...

  5. TODO:Laravel 内置简单登录

    TODO:Laravel 内置简单登录 1. 激活Laravel的Auth系统Laravel 利用 PHP 的新特性 trait 内置了非常完善好用的简单用户登录注册功能,适合一些不需要复杂用户权限管 ...

  6. 在Sublime Text 3上安装代码格式化插件CodeFormatter

    1.了解CodeFormatter插件 在Sublime Text 3中编写代码,为了能让我们的代码格式变得漂亮整洁,需要一个能自动格式代码的插件.这里发现CodeFormatter插件不错,它能支持 ...

  7. 从备考PMP到与项目经理同呼吸

    前言 PMP是什么梗? 项目管理专业人士资格认证.它是由美国项目管理协会(Project Management Institute(PMI)发起的,严格评估项目管理人员知识技能是否具有高品质的资格认证 ...

  8. jQuery之Deferred源码剖析

    一.前言 大约在夏季,我们谈过ES6的Promise(详见here),其实在ES6前jQuery早就有了Promise,也就是我们所知道的Deferred对象,宗旨当然也和ES6的Promise一样, ...

  9. 在Visual Studio Code中配置GO开发环境

    一.GO语言安装 详情查看:GO语言下载.安装.配置 二.GoLang插件介绍 对于Visual Studio Code开发工具,有一款优秀的GoLang插件,它的主页为:https://github ...

  10. ASP.NET SignaiR 实现消息的即时推送,并使用Push.js实现通知

    一.使用背景 1. SignalR是什么? ASP.NET SignalR 是为 ASP.NET 开发人员提供的一个库,可以简化开发人员将实时 Web 功能添加到应用程序的过程.实时 Web 功能是指 ...