微信支付 - iOS
前言
大家都说微信支付很麻烦,我看了一下 就做一下记录吧
正文
一:
1.微信开发网站:https://open.weixin.qq.com
注册一个开发者账号,申请一个app,(大概7个工作日,但是好像不用那么久)应该是一个账号只能申请10个app,申请开通微信支付功能。
2.demo下载地址:https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=11_1
3.我记得我下载下来的demo就是好用的,不用调。
正常交互的是
交互细节如下:
步骤1:用户进入商户APP,选择商品下单、确认购买,进入支付环节。商户服务后台生成支付订单,签名后将数据传输到APP端。以微信提供的DEMO为例,见图8.1。
步骤2:用户点击后发起支付操作,进入到微信界面,调起微信支付,出现确认支付界面,见图8.2。
步骤3:用户确认收款方和金额,点击立即支付后出现输入密码界面,可选择零钱或银行卡支付见图8.3。
![]() 图8.1 商户APP界面实例 |
![]() 图8.2 跳转到微信支付 |
图8.3 用户确认支付 |
第四步:输入正确密码后,支付完成,用户端微信出现支付详情页面。见图8.4。
第五步:回跳到商户APP中,商户APP根据支付结果个性化展示订单处理结果。见图8.5。
![]() 图8.4 支付成功提示页面 |
![]() 图8.5 返回到商户APP提示 |
4.业务流程是
商户系统和微信支付系统主要交互说明:
步骤1:用户在商户APP中选择商品,提交订单,选择微信支付。
步骤2:商户后台收到用户支付单,调用微信支付统一下单接口。
步骤3:统一下单接口返回正常的prepay_id,再按签名规范重新生成签名后,将数据传输给APP。参与签名的字段名为appId,partnerId,prepayId,nonceStr,timeStamp,package。注意:package的值格式为Sign=WXPay
步骤4:商户APP调起微信支付。
步骤5:商户后台接收支付通知。
步骤6:商户后台查询支付结果。
二:
怎么导入自己的工程里呢??
1.我现在就导入了这一个文件WXApiManager.h/m
#import "AppDelegate.h" #import "WXApi.h" #import "WXApiObject.h" #import "WXApiManager.h" @interface AppDelegate ()<WXApiDelegate> @end @implementation AppDelegate #define APPID @"wxbxxxxxxxxxxx" - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { // self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds]; // self.window.backgroundColor = [UIColor whiteColor]; // [self.window makeKeyAndVisible]; [WXApi registerApp:APPID]; return YES; } - (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url { return [WXApi handleOpenURL:url delegate:[WXApiManager sharedManager]]; } - (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation { return [WXApi handleOpenURL:url delegate:[WXApiManager sharedManager]];
// self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds]; // self.window.backgroundColor = [UIColor whiteColor]; // [self.window makeKeyAndVisible];
这个一定要注释掉
#import "ViewController.h" #import "WXApiObject.h" #import "WXApi.h" @interface ViewController () @end @implementation ViewController - (IBAction)PayButton:(id)sender { //============================================================ // V3&V4支付流程实现 // 注意:参数配置请查看服务器端Demo // 更新时间:2015年11月20日 //============================================================ NSString *i = @""; NSString *urlString = @"http://wxpay.weixin.qq.com/pub_v2/app/app_pay.php?plat=ios"; //解析服务端返回json数据 NSError *error; //加载一个NSURL对象 NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:urlString]]; //将请求的url数据放到NSData对象中 NSData *response = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil]; if ( response != nil) { NSMutableDictionary *dict = NULL; //IOS5自带解析类NSJSONSerialization从response中解析出数据放到字典中 dict = [NSJSONSerialization JSONObjectWithData:response options:NSJSONReadingMutableLeaves error:&error]; NSLog(@"url:%@",urlString); if(dict != nil){ NSMutableString *retcode = [dict objectForKey:@"retcode"]; if (retcode.intValue == 0){ NSMutableString *stamp = [dict objectForKey:@"timestamp"]; //调起微信支付 PayReq* req = [[[PayReq alloc] init]autorelease]; // req.partnerId = [dict objectForKey:@"partnerid"]; // req.prepayId = [dict objectForKey:@"prepayid"]; // req.nonceStr = [dict objectForKey:@"noncestr"]; // req.timeStamp = stamp.intValue; // req.package = [dict objectForKey:@"package"]; // req.sign = [dict objectForKey:@"sign"]; //商户号 req.partnerId = @"10000100"; //预支付交易会话ID req.prepayId = @"wx2016032814422154f71338a50151536932"; //随机字符串 req.nonceStr = @"5c95f7583741ee4ba8ae67f1658013dc"; NSMutableString *z = [NSMutableString stringWithFormat:@"1459147341"]; //时间戳 req.timeStamp = z.intValue; //扩展字段 req.package = [dict objectForKey:@"package"]; //签名 req.sign = @"22FD8F35A93E5E4EE892CE3638CE4945"; [WXApi sendReq:req]; //日志输出 NSLog(@"appid=%@\npartid=%@\nprepayid=%@\nnoncestr=%@\ntimestamp=%ld\npackage=%@\nsign=%@",[dict objectForKey:@"appid"],req.partnerId,req.prepayId,req.nonceStr,(long)req.timeStamp,req.package,req.sign ); i = @""; }else{ i = [dict objectForKey:@"retmsg"]; } }else{ i = @"服务器返回错误,未获取到json对象"; } }else{ i = @"服务器返回错误"; } }
参数都是那微信demo里的参数填的
其实现在是可以支付的,亲 可以试一下咯
2.还有通知和加密 ,下次再说咯。。。
希望可以帮打大家 有什么不对的地方 欢迎指出 大家一起≈学习😊