问题描述:
第一次做微信支付功能,有很多地方不是很懂,下面分享一下很多人都会遇到的一个问题,在调起微信支付的界面的时候,只出现了一个白色的确定按钮,如下图:
问题原因:
查了很多资料,大多数都说是签名的问题,不该直接使用服务器返回的签名,这个签名要自己生成。
解决办法:
微信开发文档中的签名算法:https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=4_3
下面介绍一下这个签名算法在iOS开发中的实现:
1.拼接参数:需要拼接的参数如下图所示
注意:这里拼接参数的顺序为:appid, noncestr, package, partnerid, prepayid, timestamp
其中:
这里的appid为创建微信应用时生成的appid,
package为固定值Sign=WXPay,
partnered为商户号,应该是申请开通微信支付的时候获取到的,
noncestr,prepayid,timestamp为服务器返回的数据
2.拼接秘钥
注意这里的秘钥的路径为:微信商户平台(pay.weixin.qq.com)-->账户设置-->API安全-->密钥设置
3.对拼接后的字符串进行MD5加密,并将加密后的结果中的小写英文字母转成大写字母
上述过程的代码如下:
#pragma mark --签名算法,获取签名
- (NSString *)getSignWithPartnerId:(NSString *)partnerId
withPrepayId:(NSString *)prepayId
withNonceStr:(NSString *)nonceStr
withTimeStamp:(UInt32)timeStamp
withPackage:(NSString *)package
{
//拼接stringA
NSString *stringA = [NSStringstringWithFormat:@"appid=%@&noncestr=%@&package=%@&partnerid=%@&prepayid=%@×tamp=%d",@"替换为微信appid", nonceStr, package, partnerId, prepayId, timeStamp];
//拼接API秘钥
NSString *stringSignTemp = [NSStringstringWithFormat:@"%@&key=%@", stringA,@"这里的key替换为微信商户平台中自己设置的key"];
//MD5签名
NSString *sign = [self md5:stringSignTemp];
//转换成大写字母
sign = [sign uppercaseString];
return sign;
}
#pragma mark --MD5签名算法
- (NSString *) md5:(NSString *) str
{
const char *cStr = [strUTF8String];
unsignedchar result[CC_MD5_DIGEST_LENGTH];
CC_MD5(cStr, strlen(cStr), result);// This is the md5 call
return [NSStringstringWithFormat:
@"%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]
];
}