前言
年末了,一直在忙项目,很少有时候写一些自己的见解。今天挤出一点时间来写一下刚刚完成的微信的支付和跳转到微信的功能。
如果你还没有做过,可以看一下,作为参考。如果你做过这个了,也可以看一下。总之一句话:有钱的捧个钱场,没钱的捧个人场。😄😄......
微信支付
我这是基于2015年12月在微信官网下载的demo写的支付,如果和你做过的不相同,请查看咱们两个的版本是否一样。
首先,我个人感觉微信现在的iOS版的前端代码比以前的简化了一些,现在的官网的demo最大的一点是不在前端放置任何数据了,都是一个接口请求下来(前一个版本还是在前端有一个微信设置例子,只是建议说后台给数据)。
支付和官方demo里面的read.text说的一样,需要两步:调用请求支付,返回支付结果。
请求支付
+ (NSString *)jumpToBizPay {
//============================================================
// V3&V4支付流程实现
// 注意:参数配置请查看服务器端Demo
// 更新时间:2015年11月20日
//============================================================
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];
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"];
[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 );
return @"";
}else{
return [dict objectForKey:@"retmsg"];
}
}else{
return @"服务器返回错误,未获取到json对象";
}
}else{
return @"服务器返回错误";
}
}
这一个方法放在WXApiRequestHandler这个类里面,这就是一个处理过程的类。
支付结果返回
- (void)onResp:(BaseResp *)resp {
if([resp isKindOfClass:[PayResp class]]){
//支付返回结果,实际支付结果需要去微信服务器端查询
NSString *strMsg,*strTitle = [NSString stringWithFormat:@"支付结果"];
switch (resp.errCode) {
case WXSuccess:
strMsg = @"我的支付结果:成功!";
NSLog(@"支付-PaySuccess,retcode = %d", resp.errCode);
break;
default:
strMsg = [NSString stringWithFormat:@"支付结果:失败!retcode = %d, retstr = %@", resp.errCode,resp.errStr];
NSLog(@"错误,retcode = %d, retstr = %@", resp.errCode,resp.errStr);
break;
}
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:strTitle message:strMsg delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil, nil];
[alert show];
}
}
这个方法放在WXApiManager类里面。
在我们需要调用微信支付的时候,调用方法:
- (void)bizPay {
NSString *res = [WXApiRequestHandler jumpToBizPay];
if( ![@"" isEqual:res] ){
UIAlertView *alter = [[UIAlertView alloc] initWithTitle:@"支付失败" message:res delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil];
[alter show];
}
}
这就是微信支付的全部过程,当然还有别忘了在appdelegate里面去调用支付结果的返回方法,这就是一个支付的全部过程。支付宝支付也是这个过程,只是说他们各自的加密等小过程不一样而已。
有时候你会奇妙的发现你跳转到微信支付的界面之后一个确定按钮,然后其他的什么都没有。我个人感觉可能有几点原因:
1.你的app里面是不是集成了一些第三方分享之类的,里面包含了分享到微信。如果有,在你appdelegate里面,把导入集成的代码放在微信注册代码的前面执行,确保程序后执行微信支付。
2.看一下自己的scheme有没有设置对,检查一下自己的微信相关配置。
3.莫名不知道的错误。删除掉app再次运行就好了。😄😄
应用间跳转到微信
我们需求是点击按钮跳转微信公众平台,并复制一个字符串到剪切板。查了好久,怎么跳转到微信。但让应用件跳转我知道怎么写,但是用的我们微信的scheme怎么都跳不过去。查了文档也是没有这一块的知识点,API。今天正好在偶然间看到了跳转微信间的各个scheme,才知道原来跳转到微信用的是微信定好的scheme。
如果你对下面这一块代码有疑问,请百度:iOS应用件跳转,相信你会找到答案。
NSString *urlStr = [NSString stringWithFormat:@"weixin://dl/officialaccounts"];
//复制字符串到剪切板
UIPasteboard *pasteboard = [UIPasteboard generalPasteboard];
pasteboard.string = @"sun yun fei";
[[UIApplication sharedApplication]openURL:[NSURL URLWithString:urlStr]];
这就是跳转的代码,点击直接跳转到微信公众平台。当然这里还是加一句判断比较好,判断一下手机是否安装了微信。
后记
这就是我自己做的微信支付与跳转,希望对你有所帮助。
demo链接,大家可以看一下(给个星星呗,各位看官),xcode7.2运行环境下写的。