iOS第三方支付-微信支付
微信支付用到的文件
1.首先支持非arc
2.设置URL types
3.AppDelegate
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
[WXApi registerApp:@"wxd930ea5d5a258f4f" withDescription:@"demo 2.0"];
return YES;
}
4.微信回调
//处理微信通过URL启动App时传递的数据
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation {
return [WXApi handleOpenURL:url delegate:self];
}
//微信回调
- (void)onResp:(BaseResp *)resp {
//errCode
switch (resp.errCode) {
case WXSuccess:
//成功回调
break;
default:
break;
}
}
5.调用微信支付(主要代码,后台签名)
//调起微信支付
PayReq* req = [[PayReq alloc] init];
req.openID = APPI_ID;
req.partnerId = PARTNER_ID;
req.prepayId = prePayid;
req.nonceStr = nonce_str;
req.timeStamp = now;
req.package = package;
req.sign = sign;
[WXApi safeSendReq:req];
6.如果要在程序签名
//
// ViewController.m
// WxPay
//
// Created by apple on 15/6/9.
// Copyright (c) 2015年 tqh. All rights reserved.
// #import "ViewController.h"
#import "payRequsestHandler.h"
#import "WXApi.h" @interface ViewController () {
enum WXScene _scene;
NSString *Token;
long token_time;
} @end @implementation ViewController - (instancetype)init
{
self = [super init];
if (self) {
_scene = WXSceneSession;
}
token_time = ;
return self;
} - (void)viewDidLoad {
[super viewDidLoad];
//向微信注册
//微信支付
UIButton *but2 = [[UIButton alloc]initWithFrame:CGRectMake(, , , )];
[but2 setTitle:@"微信支付" forState:UIControlStateNormal];
but2.backgroundColor = [UIColor lightGrayColor];
[but2 addTarget:self action:@selector(wxpay) forControlEvents:UIControlEventTouchUpInside];
[but2 setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];
[self.view addSubview:but2];
} //微信支付
- (void)wxpay
{
//商户号
NSString *PARTNER_ID = @"";
//商户密钥
NSString *PARTNER_KEY = @"8934e7d15453e97507ef794cf7b0519d";
//APPID
NSString *APPI_ID = @"wxd930ea5d5a258f4f";
//appsecret
NSString *APP_SECRET = @"db426a9829e4b49a0dcac7b4162da6b6";
//支付密钥
NSString *APP_KEY = @"L8LrMqqeGRxST5reouB0K66CaYAWpqhAVsq7ggKkxHCOastWksvuX1uvmvQclxaHoYd3ElNBrNO2DHnnzgfVG9Qs473M3DTOZug5er46FhuGofumV8H2FVR9qkjSlC5K";
//支付结果回调页面
NSString *NOTIFY_URL = @"http://localhost/pay/wx/notify_url.asp";
//订单标题
NSString *ORDER_NAME = @"Ios客户端签名支付 测试";
//订单金额,单位(分)
NSString *ORDER_PRICE = @"";
//创建支付签名对象
payRequsestHandler *req = [payRequsestHandler alloc];
//初始化支付签名对象
[req init:APPI_ID app_secret:APP_SECRET partner_key:PARTNER_KEY app_key:APP_KEY];
//判断Token过期时间,10分钟内不重复获取,测试帐号多个使用,可能造成其他地方获取后不能用,需要即时获取
time_t now;
time(&now);
//if ( (now - token_time) > 0 )//非测试帐号调试请启用该条件判断
{
//获取Token
Token = [req GetToken];
//设置Token有效期为10分钟
token_time = now + ;
//日志输出
NSLog(@"获取Token: %@\n",[req getDebugifo]);
}
if ( Token != nil){
//================================
//预付单参数订单设置
//================================
NSMutableDictionary *packageParams = [NSMutableDictionary dictionary];
[packageParams setObject: @"WX" forKey:@"bank_type"];
[packageParams setObject: ORDER_NAME forKey:@"body"];
[packageParams setObject: @"" forKey:@"fee_type"];
[packageParams setObject: @"UTF-8" forKey:@"input_charset"];
[packageParams setObject: NOTIFY_URL forKey:@"notify_url"];
[packageParams setObject: [NSString stringWithFormat:@"%ld",time()] forKey:@"out_trade_no"];
[packageParams setObject: PARTNER_ID forKey:@"partner"];
[packageParams setObject: @"196.168.1.1" forKey:@"spbill_create_ip"];
[packageParams setObject: ORDER_PRICE forKey:@"total_fee"];
NSString *package, *time_stamp, *nonce_str, *traceid;
//获取package包
package = [req genPackage:packageParams];
//输出debug info
NSString *debug = [req getDebugifo];
NSLog(@"gen package: %@\n",package);
NSLog(@"生成package: %@\n",debug);
//设置支付参数
time_stamp = [NSString stringWithFormat:@"%ld", now];
nonce_str = [TenpayUtil md5:time_stamp];
traceid = @"mytestid_001";
NSMutableDictionary *prePayParams = [NSMutableDictionary dictionary];
[prePayParams setObject: APPI_ID forKey:@"appid"];
[prePayParams setObject: APP_KEY forKey:@"appkey"];
[prePayParams setObject: nonce_str forKey:@"noncestr"];
[prePayParams setObject: package forKey:@"package"];
[prePayParams setObject: time_stamp forKey:@"timestamp"];
[prePayParams setObject: traceid forKey:@"traceid"];
//生成支付签名
NSString *sign;
sign = [req createSHA1Sign:prePayParams];
//增加非参与签名的额外参数
[prePayParams setObject: @"sha1" forKey:@"sign_method"];
[prePayParams setObject: sign forKey:@"app_signature"];
//获取prepayId
NSString *prePayid;
prePayid = [req sendPrepay:prePayParams];
//输出debug info
debug = [req getDebugifo];
NSLog(@"提交预付单: %@\n",debug);
if ( prePayid != nil) {
//重新按提交格式组包,微信客户端5.0.3以前版本只支持package=Sign=***格式,须考虑升级后支持携带package具体参数的情况
//package = [NSString stringWithFormat:@"Sign=%@",package];
package = @"Sign=WXPay";
//签名参数列表
NSMutableDictionary *signParams = [NSMutableDictionary dictionary];
[signParams setObject: APPI_ID forKey:@"appid"];
[signParams setObject: APP_KEY forKey:@"appkey"];
[signParams setObject: nonce_str forKey:@"noncestr"];
[signParams setObject: package forKey:@"package"];
[signParams setObject: PARTNER_ID forKey:@"partnerid"];
[signParams setObject: time_stamp forKey:@"timestamp"];
[signParams setObject: prePayid forKey:@"prepayid"];
//生成签名
sign = [req createSHA1Sign:signParams];
//输出debug info
debug = [req getDebugifo];
NSLog(@"调起支付签名: %@\n",debug);
//调起微信支付
PayReq* req = [[PayReq alloc] init];
req.openID = APPI_ID;
req.partnerId = PARTNER_ID;
req.prepayId = prePayid;
req.nonceStr = nonce_str;
req.timeStamp = now;
req.package = package;
req.sign = sign;
[WXApi safeSendReq:req];
}else{
/*long errcode = [req getLasterrCode];
if ( errcode == 40001 )
{//Token实效,重新获取
Token = [req GetToken];
token_time = now + 600;
NSLog(@"获取Token: %@\n",[req getDebugifo]);
};*/
NSLog(@"获取prepayid失败\n");
[self alert:@"提示信息" msg:debug];
}
}else{
NSLog(@"获取Token失败\n");
[self alert:@"提示信息" msg:@"获取Token失败"];
}
} //客户端提示信息
- (void)alert:(NSString *)title msg:(NSString *)msg
{
UIAlertView *alter = [[UIAlertView alloc] initWithTitle:title message:msg delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil];
[alter show];
} //- (void)onReq:(BaseReq *)req {
// NSLog(@"qwe123");
//} - (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
} @end
DEMO下载地址:http://pan.baidu.com/s/1jGjCaJc
补:有些童鞋出现跳到微信支付又跳回来的情况一般是你集成了第三方分享功能需要进行一下判断
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation
上面方法里面进行是不是微信支付的判断
if ([url.host isEqualToString:@"pay"]) {
[WXApi handleOpenURL:url delegate:self];
}
return YES;
~~~~~~~~~~~~~~~~~~~~~~至于分享写在哪里,自己脑补~~~~~~~~~~~~~~~~
iOS第三方支付-微信支付的更多相关文章
- iOS应用之微信支付集成-直接前端集成
所有信息的生成都在前端完成,包括对订单进行sign签名以及MD5签名加密(此方法相对来说有些复杂,没有官方给的方法简单).注:官方给的是v3&v4支付流程,签名和加密都是在服务器端进行,由于没 ...
- iOS中 最新微信支付/最全的微信支付教程详解 韩俊强的博客
每日更新关注:http://weibo.com/hanjunqiang 新浪微博! 亲们, 首先让我们来看一下微信支付的流程吧. 1. 注册微信开放平台,创建应用获取appid,appSecret, ...
- iOS中 最新微信支付/最全的微信支付教程具体解释 韩俊强的博客
亲们, 首先让我们来看一下微信支付的流程吧. 1. 注冊微信开放平台,创建应用获取appid,appSecret,申请支付功能,申请成功之后会返回一些參数. 2. 下载微信支付sdk 3. clien ...
- iOS开发集成微信支付
首先需要理清楚流程: 1.用户使用APP客户端,选择商品下单. 2.商户客户端(就是你做的APP)将用户的商品数据传给商户服务器,请求生成支付订单. 3.商户后台调用统一下单API向微信的服务器发送请 ...
- iOS三方支付--微信支付/支付宝支付
一.微信支付 1.注册账号并申请app支付功能 公司需要到微信开放品台进行申请app支付功能 , 获得appid和微信支付商户号(mch_id)和API秘钥(key) . Appsecret(secr ...
- 微信JSApi支付~微信支付代理模式的实现(原创)
返回目录 起因(大叔原创) 对于微信支付来说,你的发起者需要配置对应的域名来获取code(获取用户信息接口),而这意味着,你的多个项目(域名不同)不能同时使用一个公众号,这是一件很操蛋的事,对于我们开 ...
- 支付宝支付 微信支付SDK接口不统一? 盘他!
开发过支付宝.微信支付的同学都知道,微信的支付 API 设计感觉是 Java 开发工程师写的,远不如支付宝 SDK 的接口设计用起来顺手.在这里,统一封装微信支付和支付宝支付的API,使两种支付方 ...
- android app 集成 支付宝支付 微信支付
项目中部分功能点需要用到支付功能,移动端主要集成支付宝支付和微信支付 支付宝sdk以及demo下载地址:https://doc.open.alipay.com/doc2/detail.htm?spm= ...
- iOS支付宝,微信,银联支付集成封装(上)
一.集成支付宝支付 支付宝集成官方教程https://docs.open.alipay.com/204/105295/ 支付宝集成官方demo https://docs.open.alipay.com ...
- 李洪强iOS开发支付集成之微信支付
iOS开发支付集成之微信支付 微信支付也是需要签名的,也跟支付宝一样,可以在客户端签名,也可以在后台签名(当然,为了安全还是推荐在服务器上做签名,逻辑也比较好理解). 1 - 集成前首先要看看文档 开 ...
随机推荐
- 263. Ugly Number
Write a program to check whether a given number is an ugly number. Ugly numbers are positive numbers ...
- poj 2507Crossed ladders <计算几何>
链接:http://poj.org/problem?id=2507 题意:哪个直角三角形,一直角边重合, 斜边分别为 X, Y, 两斜边交点高为 C , 求重合的直角边长度~ 思路: 设两个三角形不重 ...
- Java并发编程实战---第六章:任务执行
废话开篇 今天开始学习Java并发编程实战,很多大牛都推荐,所以为了能在并发编程的道路上留下点书本上的知识,所以也就有了这篇博文.今天主要学习的是任务执行章节,主要讲了任务执行定义.Executor. ...
- bzoj 1054 移动玩具
题目连接 http://www.lydsy.com/JudgeOnline/problem.php?id=1054 移动玩具 Description 在一个4*4的方框内摆放了若干个相同的玩具,某人想 ...
- JavaScript 字符串处理详解【转自:http://www.cnblogs.com/mondLei/p/4096855.html】
一.创建字符串 创建一个字符串,将一组字符串用引号包起来,将其赋值给一个字符串变量. var JsStr="Hello,JavaScript String!"; 二.字 ...
- C# DateTime详解
//今天DateTime.Now.Date.ToShortDateString();//昨天,就是今天的日期减一DateTime.Now.AddDays(-1).ToShortDateString() ...
- MongoDB学习笔记-查询
MongoDB中使用find或findOne函数执行查询 find函数 db.c.find()--查询集合c所有 db.c.find({“name”:”zhangsan”}) 注意:查询条件的值必须是 ...
- 从烙铁手到IT男
时间:2015年8月27日 21:37:44 作者:luomg 摘要: 简要记录一写自己干的这个行当,多少是个回忆,不然某一天呜呼哀哉了啥也没有记录,会随着时间更新(大学时熬夜绘制了很多altium ...
- Linux C 文件与目录2 文件的打开与关闭
文件的打开与关闭 open和close 文件的打开指的是从磁盘中找到一个文件,返回一个整形的打开文件顺序的编号.打开的文件处于可读.可写状态.文件的关闭指的是释放打开的文件,是文件处于不可读写的状态. ...
- OpenCV检测人脸实例代码
下面是使用OpenCV通过在硬盘中读入图像来对其进行Haar人脸检测的代码. //包含头文件 #include <opencv2/core/core.hpp> #include " ...