自支付宝之后,微信支付也靠着自己盘大的用户量逐渐的占领移动支付的市场,为了适应市场变化,果断在项目中集成了微信支付,下面来说说集成过程中的一些坑,菜鸟初成长,大牛绕路。
微信官方集成文档:
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"];
}