您的位置:首页 > 移动开发 > 微信开发

IOS微信支付 总结

2016-01-01 21:40 716 查看
1、需要的文件 和数据

(I)、需要的数据

A>>>红色的为辅助文件, 若预付订单在服务器上生成,可以不需要这个。

B>>>蓝色的文 微信官方提供的SDK



(II)、需要的数据

其中前三个是必须的, 后两个 我配置的时候暂时没用到。

A>>> APP_ID @"wxe2c244c0243fbb50"

B>>> MCH_ID @"1220892901" 微信发送到个人邮箱的 商户号注意是:10位数字

C>>>PARTNER_Key @"a2067c2e1a0327a3aa437d76f59b3ac3"

————————————————=—————————

————————————————=—————————

D>>>APP_SECRET @"ac41b7eddd9482594feedca01ae9940d"

E>>>APP_Key @"yePd1EMqjBHtkIrdraJs0sGtaEjtzbfH8SBuzGqkyBnSZNI5kuu93lSwLO41ctT8RPNi5IPjid9lsjfVP2oRKei4KEZdidxtk41oTRoljCKdhYyhIFieWBw8r4ZLDuqu"

2、设置回调URL:

详情参考微信官方文档, 虽然不全但是很权威 https://pay.weixin.qq.com/wiki/doc/api/app.php?chapter=8_5
1、把准备好的 SDK和辅助文件拖入工程

2、添加回调URL 如下截图



3、APPDeleget中

#import "WXApi.h"
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
//注册微信支付
[WXApi registerApp:@"wx774b6ed9aa2aaeeb" withDescription:@"demo 2.0"];
}
//处理微信通过URL启动App时传递的数据
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation
{
[WXApi handleOpenURL:url delegate:self];
return YES;
}
//微信回调
- (void)onResp:(BaseResp *)resp {
//回到中间模块(如果被用户点走了)
JY_TabBarController *tabBar = [JY_TabBarController tabCtrOnce];
[tabBar setSelectedIndex:2];
CGRect rect = tabBar.tabBar.frame;
rect.origin.y =K_ManScreenHeight;
tabBar.tabBar.frame = rect;

//errCode
switch (resp.errCode) {
case WXSuccess:{
//            成功回调
//            支付完成

}break;
default:{//提示微信支付失败

}break;
}
}


4、APP_ID等参数的 设置如截图



5、微信支付进行时 (关键代码)

首先调用统一下单, 获取预付ID(可再服务器上操作, 省去此步骤)。

然后调起支付。

//统一下单
-(Void)toPay{
//创建支付签名对象
payRequsestHandler *req = [[payRequsestHandler alloc] init];
//初始化支付签名对象
[req init:APP_ID mch_id:MCH_ID];
//    设置密钥
[req setKey:PARTNER_Key];

/******************************************
******************************************/
//统一下单 获取预付ID
NSString *prePayId =  [self getPrePayIdWith:req];

//发起支付
if (prePayId) {
if ([self payWithPrepayid:prePayId with:req]) {
NSLog(@"调用微信成功");
}else{
NSLog(@"调用微信失败");
}
}
}

//统一下单
-(NSString *)getPrePayIdWith:(payRequsestHandler *)req{
time_t  now;
time(&now);
NSString *time_stamp              = [NSString stringWithFormat:@"%ld", now];//时间戳
NSString *nonce_str               = [WXUtil md5:time_stamp];//随机字符

NSMutableDictionary *prePayParams = [[NSMutableDictionary alloc] init];
[prePayParams setObject:APP_ID              forKey:@"appid"];
[prePayParams setObject:MCH_ID              forKey:@"mch_id"];
[prePayParams setObject:nonce_str           forKey:@"nonce_str"];//随机字符串
[prePayParams setObject:@"商品"              forKey:@"body"];//商品或支付单简要描述
[prePayParams setObject:[self generateTradeNO]   forKey:@"out_trade_no"];//商户系统内部的订单号,32个字符内、可包含字母
[prePayParams setObject:@"1"                forKey:@"total_fee"];//以分位单位 int 类型
[prePayParams setObject:[self getIPAddress] forKey:@"spbill_create_ip"];//本机IP
[prePayParams setObject:NOTIFY_URL          forKey:@"notify_url"];//接收微信支付异步通知回调地址
[prePayParams setObject:@"APP"              forKey:@"trade_type"];

//最后添加签名信息
NSString *sign = [req createMd5Sign:prePayParams];
[prePayParams setObject:sign forKey:@"sign"];//签名

NSString * prePayid = [req sendPrepay:prePayParams];
return prePayid;
}
//发起支付
-(BOOL)payWithPrepayid:(NSString *)prePayId with:(payRequsestHandler *)req{

time_t  now;
time(&now);
NSString *time_stamp  = [NSString stringWithFormat:@"%ld", now];
NSString *nonce_str	= [WXUtil md5:time_stamp];

NSMutableDictionary *prePayParams = [[NSMutableDictionary alloc] init];
[prePayParams setObject:APP_ID          forKey:@"appid"];
[prePayParams setObject:MCH_ID          forKey:@"partnerid"];
[prePayParams setObject:prePayId        forKey:@"prepayid"];
[prePayParams setObject:@"Sign=WXPay"   forKey:@"package"];
[prePayParams setObject:nonce_str       forKey:@"noncestr"];
[prePayParams setObject:time_stamp      forKey:@"timestamp"];
//获取签名信息
NSString *sign= [req createMd5Sign:prePayParams];

//输出debug info
NSString *debug     = [req getDebugifo];
NSLog(@"调起支付签名: %@\n",debug);

//调起微信支付
PayReq* payReq = [[PayReq alloc] init];
payReq.openID      = [prePayParams objectForKey:@"appid"];
payReq.partnerId   = [prePayParams objectForKey:@"partnerid"];
payReq.prepayId    = [prePayParams objectForKey:@"prepayid"];
payReq.nonceStr    = [prePayParams objectForKey:@"noncestr"];
payReq.timeStamp   = (int)now;
payReq.package     = [prePayParams objectForKey:@"package"];
payReq.sign        = sign;

BOOL aBool = [WXApi sendReq:payReq];
return aBool;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: