iOS微信支付——APP调用微信支付接口
一、准备工作
1.必须通过微信审核的微信APPID 不然就没法实现微信支付功能
2.查看iOS微信支付官方文档去集成到你的工程文件中 微信支付官方文档
这两步做好后就可以开始调用微信支付接口来支付了,下面看具体怎么做
二 调起微信支付接口
2.1 集成微信支付SDK后在你的 AppDelegate.m 中注册微信的APPID
- (BOOL)application:(UIApplication*)application didFinishLaunchingWithOptions:(NSDictionary*)launchOptions {
//微信支付
[WXApi registerApp:@"你的APPID" withDescription:@"最好是填APP名"];
}
2.2 从自己的服务器获取订单的预支付信息,前提是服务器端已经调用了微信的统一下单接口
从服务器获取的信息中的信息是:
appid = 123456789;//从服务器获取的
"mch_id" = 1426349502;
"nonce_str" = Jtk3gcIfmsyYKyx7;
"prepay_id" = wx2017010311540938e8e489660575993008;
"result_code" = SUCCESS;
"return_code" = SUCCESS;
"return_msg" = OK;
sign = 562787A84AE02285F6AB3509C174491B;
"trade_type" = APP;
先看代码,再说明存在的坑
NSDate*datenow = [NSDatedate];//现在时间,你可以输出来看下是什么格式
//时间转时间戳的方法:
NSString*timeSp = [NSStringstringWithFormat:@"%ld", (long)[datenowtimeIntervalSince1970]];
NSLog(@"timeSp:%ld",(long)[timeSpintegerValue] );//时间戳的值
NSMutableDictionary*dic = [NSMutableDictionarydictionaryWithCapacity:10];
dic[@"appid"] =@"你的APPID";//可以写死,也可以写成 从服务器获取的appid,
dic[@"partnerid"] = responseObject[@"result"][@"mch_id"];//商户ID
dic[@"prepayid"] = responseObject[@"result"][@"prepay_id"];
dic[@"noncestr"] = responseObject[@"result"][@"nonce_str"];
dic[@"timestamp"] = [NSStringstringWithFormat:@"%ld",(long)[timeSpintValue]];
dic[@"package"] =@"Sign=WXPay";
BZLog(@"=====%@",dic);
NSMutableString*contentString=[NSMutable Stringstring];
NSArray*keys = [dicallKeys];
//按字母顺序排序
NSArray*sortedArray = [keys sortedArrayUsingComparator:^NSComparisonResult(idobj1,idobj2) {
return[obj1 compare:obj2 options:NSNumericSearch];
}];
BZLog(@"+++++%@",sortedArray);
//拼接字符串
for(NSString*categoryIdinsortedArray) {
if(![[dic objectForKey:categoryId] isEqualToString:@""]
&& ![[dic objectForKey:categoryId] isEqualToString:@"sign"]
&& ![[dic objectForKey:categoryId] isEqualToString:@"key"]
)
{
[contentString appendFormat:@"%@=%@&", categoryId, [dicobjectForKey:categoryId]];
}
}
//添加商户密钥key字段API密钥
[contentStringappendFormat:@"key=%@",@"575fe81f69ad0dc054c35f478de8d70e"];
BZLog(@"contentString%@",contentString);
NSString*md5SignStr = [BZNetworkingManage MD5StrWithSignStr:contentString];//md5加密
//调起微信支付
PayReq*req= [[PayReqalloc]init];
req.partnerId= dic[@"partnerid"];//商户ID
req.prepayId= dic[@"prepayid"];
req.nonceStr= dic[@"noncestr"];
UInt32timeStamp =[dic[@"timestamp"]intValue];
req.timeStamp= timeStamp;
req.package=@"Sign=WXPay";
req.sign= md5SignStr;
[WXApisendReq:req];
存在的坑:
1.可能在调起微信后,只出现了一个确定按钮的界面的,点击确定返回回调值是 -2 ,出现这个问题所在的原因是req属性值错了,最有可能的原因是sign 错了
1.从服务器获取的预支付信息中有签名 sign ,开始的时候我也直接用这个 sign 赋值给req.sign ,但是出现了调起微信后只出现一个确定按钮,这就是sign的坑所在,不能用服务器返回的sign传过去,需要重新签名。具体参照上面的代码。