iOS微信支付——APP调用微信支付接口

2018-02-28  本文已影响152人  andy_xin

一、准备工作

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传过去,需要重新签名。具体参照上面的代码。

上一篇下一篇

猜你喜欢

热点阅读