IOS关于微信支付的1点小事
自支付宝之后,微信支付也靠着自己盘大的用户量逐渐的占领移动支付的市场,为了适应市场变化,果断在项目中集成了微信支付,下面来说说集成过程中的一些坑,菜鸟初成长,大牛绕路。
微信官方集成文档:
http://mch.weixin.qq.com/wiki/doc/api/app.php?chapter=8_5
微信给的demo基本已经一清二楚了,只要按照文档的步骤,以下为简要操作:
建议先运行demo,在demo成功调起支付再集成到项目,大牛可直接上。
1.项目设置appid
集成第三方的东西都有这个家伙,不解释,关键是看下图,将demo的URL Schemes换成自己的。
2.填写一些配置信息,在payRequsestHandler中,填写APP_ID,APP_SECRET,MCH_ID,PARTNER_ID见下图:
3.command + r,开启微信支付之旅吧
4.不出意外的话,你可以看到如下界面
5.点击微信支付测试签名,便可成功调起微信支付,若在demo中不能成功调起,请检查URL Schemes有没有正确设置,四个参数是否正确。
demo测试成功,本以为集成到项目也是可以一次成功,可是结果不如人意。
将依赖的微信sdk导入到我自己的项目,设置了URL Schemes,四个参数是在测试成功的demo中copy过来,确保无问题,可是,当运行了项目,点击支付调起微信支付却是调不起微信,[WXApi sendReq:payReq]也一直返回的时false,失败。
后来,在CocoaChina看到有关于这个问题的回答,原文点此查看,大概内容如下:
接入微信支付,成功配置参数,发现无法成功调起微信,将代码抽到一个新的工程可以成功调起,后来发现项目中集成了友盟分享SDK,调起支付的时候,因为library search paths里面友盟SDK里面的微信SDK在前面,这就导致覆盖了我们导入的微信SDK。你调用接口时实际上调用的是友盟SDK里面的微信接口。可能友盟SDK暂时不支持微信支付,所以无法成功调起。
看完这,瞬间想到我项目中集成的shareSDK,果断将shareSDK下面的微信SDK删去,运行,成功了,困扰了一个下午的问题终于搞定了
获取支付后的结果的返回信息,需要去AppDelegate里,添加如下代码,添加微信的代理:
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation { return [WXApi handleOpenURL:url delegate:self]; }然后,再实现这个方法:
-(void) onResp:(BaseResp*)resp通过这个方法,你就可以获取微信支付后的信息了。但是如果这样,所有的支付代码都在AppDelegate里,不好,至少微信给的例子就是这样。以下方法是添加通知,参考此博客代码如下:
-(void) onResp:(BaseResp*)resp { if ([resp isKindOfClass:[PayResp class]]) { PayResp *response = (PayResp *)resp; switch (response.errCode) { case WXSuccess: { NSNotification *notification = [NSNotification notificationWithName:@"wxPay" object:@"success"]; [[NSNotificationCenter defaultCenter] postNotification:notification]; break; } default: { NSNotification *notification = [NSNotification notificationWithName:@"wxPay" object:@"fail"]; [[NSNotificationCenter defaultCenter] postNotification:notification]; break; } } } }然后,在我们调起支付的controller添加一个通知,用户接收回调信息:
- (void)viewWillAppear:(BOOL)animated{ [super viewWillAppear:animated]; if([WXApi isWXAppInstalled]) // 判断 用户是否安装微信 { [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(getOrderPayResult:) name:@"wxPay" object:nil];//监听一个通知 } } - (void)getOrderPayResult:(NSNotification *)notification{ NSLog(@"%@",notification.object); BOOL payResult = [notification.object isEqualToString:@"success"]; }