微信支付

目前项目里有微信支付的需求,调研过一段时间后,发现其实并没有想象中的那么困难。如果你只是想实现该功能,一个方法足以,但是若你想深入了解实现原理。就需要花费更多的功夫了。目前我只清楚微信支付需要做签名,一种是在后台签名,一种是自己在前端签名。其实这对前端来说代码量并没有多大的改变,最大的区别是在后台签名逻辑更容易理解,而在前端签名逻辑有些混乱。

现在,小编也只是知道怎么使用,而不得其精髓,现在我附上我的学习链接,为了避免以后链接出现不可用情况,请各位理解小编的粘贴复制。

博客园(幻想无极) http://www.cnblogs.com/hxwj/p/4563351.html

微信支付开发文档    http://mch.weixin.qq.com/wiki/doc/api/app.php?chapter=8_1

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 = 0;

return self;

}

- (void)viewDidLoad {

[super viewDidLoad];

//向微信注册

//微信支付

UIButton *but2 = [[UIButton alloc]initWithFrame:CGRectMake(200, 100, 100, 40)];

[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    = @"1900000109";

//商户密钥

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  = @"1";

//创建支付签名对象

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 + 600;

//日志输出

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: @"1"                                              forKey:@"fee_type"];

[packageParams setObject: @"UTF-8"                                          forKey:@"input_charset"];

[packageParams setObject: NOTIFY_URL                                        forKey:@"notify_url"];

[packageParams setObject: [NSString stringWithFormat:@"%ld",time(0)]        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;

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,482评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,377评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,762评论 0 342
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,273评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,289评论 5 373
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,046评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,351评论 3 400
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,988评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,476评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,948评论 2 324
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,064评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,712评论 4 323
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,261评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,264评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,486评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,511评论 2 354
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,802评论 2 345

推荐阅读更多精彩内容