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;
}