您的位置:首页 > 移动开发 > 微信开发

iOS 集成微信支付

2017-03-17 00:00 148 查看
主要写下关键

发起支付

- (NSString *)jumpToBizPayWithDic:(NSDictionary *)dict {

if (![WXApi isWXAppInstalled]) {
return @"该设备没有安装微信";
}
if (![WXApi isWXAppSupportApi]) {
return @"该设备不支持微信";
}

if(dict != nil){

NSString *orderId = [dict objectForKey:@"ordersn"];
UInt32 timeStamp = [self stamp];
NSString *nonceStr =  [dict objectForKey:@"nonceStr"];
NSString *package = @"Sign=WXPay";

NSString *md5sign = [self signWithappid:wx_appid
andnoncestr:nonceStr
andpackage:package
andpartnerid:PARTNER_Id
andprepayid:orderId
andtimestamp:timeStamp
andkey:PARTNER_Id_key];

//调起微信支付 主要参数:
PayReq* req             = [[PayReq alloc] init];
req.partnerId           = PARTNER_Id;                     // 商户id 这个是固定的,必须wx124
req.prepayId            = orderId;                        // 订单号 这个是后台返回的(是预付订单号)
req.nonceStr            = nonceStr;                     // 随机数 (需要后台返回,不能自己生产,因为要保持一致)
req.timeStamp           = timeStamp;                   // 时间戳 (可以自己生成,也可以后台返回)
req.package             = package;                  // 扩展字段 (微信要求暂时传@"Sign=WXPay")
req.sign                = md5sign; // 这个签名最关键,也最容易出错,基本都被坑在这里(自己生成的,生成方法下面有)

BOOL flag = [WXApi sendReq:req];

return @"";

}else{
return @"服务器返回错误,未获取到json对象";
}
}

签名生成方法(方法名没有大写,因为微信参数拼接的时候,参数名要求全小写,怕出错,所以全部是是复制进去的……)

//最坑的地方,需要仔仔细细的看文档,参数有顺序,所以我把顺序已经写死了。key必须放在最后。需要把7个参数拼接一起,然后md5编码(注意还是大写)。
- (NSString *)signWithappid:(NSString *)appid
andnoncestr:(NSString *)noncestr
andpackage:(NSString *)package
andpartnerid:(NSString *)partnerid
andprepayid:(NSString *)prepayid
andtimestamp:(UInt32)timestamp
andkey:(NSString *)key{
NSString *string = [NSString stringWithFormat:@"appid=%@&noncestr=%@&package=%@&partnerid=%@&prepayid=%@×tamp=%@&key=%@",appid,noncestr,package,partnerid,prepayid,[NSString stringWithFormat:@"%u",timestamp],key];
NSString * md5str = [self md5: string];
NSString *us = md5str.uppercaseString;
return us;
}

md5编码方式:

- (NSString *)md5:(NSString *)str
{
const char *cStr = [str UTF8String];
unsigned char result[16];
CC_MD5(cStr, strlen(cStr), result); // This is the md5 call
return [NSString stringWithFormat:
@"%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x",
result[0], result[1], result[2], result[3],
result[4], result[5], result[6], result[7],
result[8], result[9], result[10], result[11],
result[12], result[13], result[14], result[15]
];

}

最后附一个签名检查工具,官方的
https://pay.weixin.qq.com/wiki/tools/signverify/

其实我是遇到另外一个更坑的东西。
appid和商户的key是boss直接给我的,安卓那边已经实现了支付,所以认为这两个参数是没问题的
当我被"商户下单id非法"这个问题坑了很久很久之后登陆开放平台,发现创建应用的时候没有勾选iOS……
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息