照着官网写好了 支付直接报败,挫败~~~
先把官方demo下载下来,可以本地倒入sdk,我是适用的pods,因为之前已经集成了分享功能,已经有微信的sdk了,所以我只需要倒入XMLDictionary、DataMD5这俩工具类到我的项目,这个我放本地了,还有一点需要注意的是,集成过微信之后,做支付的时候,注册微信注意放到分享之后!!
我的didFinishLaunchingWithOptions方法里这样写的:
- (void)registerApp {
//打开日志
[[UMSocialManager defaultManager] openLog:YES];
// 获取友盟social版本号
NSLog(@"UMeng social version: %@", [UMSocialGlobal umSocialSDKVersion]);
//设置友盟appkey
[[UMSocialManager defaultManager] setUmSocialAppkey:UmSocialAppkey];
//设置微信的appKey和appSecret
[[UMSocialManager defaultManager] setPlaform:UMSocialPlatformType_WechatSession appKey:WeiXinAppKey appSecret:WeiXinAppSecret redirectURL:@"http://sns.whalecloud.com"];
//设置分享到QQappID
[[UMSocialManager defaultManager] setPlaform:UMSocialPlatformType_QQ appKey:QQAppKey/*设置QQ平台的appID*/ appSecret:QQAppSecret redirectURL:@"http://sns.whalecloud.com"];
//微博的appKey
[[UMSocialManager defaultManager] setPlaform: UMSocialPlatformType_Sina appKey:WeiBoAppKey appSecret:WeiBoAppSecret redirectURL:@"http://sns.whalecloud.com"];
// 微信支付 有分享的时候 注册放在分享后面
[WXApi registerApp:WeiXinAppKey];
}
具体的介绍看官方和百度,我这里记录一下自己出问题的地方:
1、下单、签名操在后台完成:
需要的参数包括:appid、partid(商户号)、prepayid(预支付订单ID)、noncestr(参与签名的随机字符串)、timestamp(参与签名的时间戳)、sign(签名字符串)这六个大概;
2、客户端拿着这些参数掉起支付:
//需要创建这个支付对象
PayReq *req = [[PayReq alloc] init];
//由用户微信号和AppID组成的唯一标识,用于校验微信用户
req.openID = WeiXinAppKey;
// 商家id,在注册的时候给的
req.partnerId = orderInfo[@"mch_id"];
// 预支付订单这个是后台跟微信服务器交互后,微信服务器传给你们服务器的,你们服务器再传给你
req.prepayId = orderInfo[@"prepay_id"];
// 根据财付通文档填写的数据和签名
//这个比较特殊,是固定的,只能是即req.package = Sign=WXPay
req.package = @"Sign=WXPay";
// 随机编码,为了防止重复的,在后台生成
req.nonceStr = orderInfo[@"nonce_str"];
// 这个是时间戳,也是在后台生成的,为了验证支付的
//将当前事件转化成时间戳
NSDate *datenow = [NSDate date];
NSString *timeSp = [NSString stringWithFormat:@"%ld", (long)[datenow timeIntervalSince1970]];
UInt32 timeStamp =[timeSp intValue];
req.timeStamp= timeStamp;
// 签名加密
DataMD5 *md5 = [[DataMD5 alloc] init];
req.sign=[md5 createMD5SingForPay:req.openID partnerid:req.partnerId prepayid:req.prepayId package:req.package noncestr:req.nonceStr timestamp:req.timeStamp];
//发送请求到微信,等待微信返回onResp
BOOL status = [WXApi sendReq:req];
3、得到支付结果,在AppDelegate.m文件里吗写回调的通知:
//微信SDK自带的方法,处理从微信客户端完成操作后返回程序之后的回调方法,显示支付结果的
-(void)onResp:(BaseResp*)resp
{
//启动微信支付的response
if([resp isKindOfClass:[PayResp class]]){
[[NSNotificationCenter defaultCenter] postNotificationName:@"WXpayresult" object:[NSString stringWithFormat:@"%d",resp.errCode]];
}
}
在发起支付的地方监听到回掉消息做相应处理:
- (void)viewDidLoad {
[super viewDidLoad];
// 注册监听 - 微信支付结果
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(showWXPayResult:) name:@"WXpayresult" object:nil];
}
- (void)viewDidDisappear:(BOOL)animated {
[super viewDidDisappear:animated];
[[NSNotificationCenter defaultCenter] removeObserver:self];
}
#pragma mark 微信支付的结果
- (void)showWXPayResult:(NSNotification *)notification {
NSString *result = notification.object;
//支付返回结果,实际支付结果需要去微信服务器端查询
NSString *payResoult = @"";
if (result.intValue == 0) {
payResoult = @"支付结果:成功!";
}else {
self.payResult = NO;
switch (result.intValue) {
case -1:
payResoult = @"支付结果:失败!";
break;
case -2:
payResoult = @"用户已经退出支付!";
break;
default:
payResoult = [NSString stringWithFormat:@"支付结果:失败!retcode = %d", result.intValue];
break;
}
UIAlertView * alert = [[UIAlertView alloc]initWithTitle:@"提示" message:payResoult delegate:nil cancelButtonTitle:@"好的" otherButtonTitles: nil];
[alert show];
}
}