17 微信和支付宝的坑记录
2016-09-12 本文已影响0人
_Nevermore
1.报错:openssl/asn1.h file could'n found
解决办法:文件夹头文件链接问题,如果openssl文件夹随意拉进项目中,即使添加头文件链接,也可能解决不了此问题,
这也是问什么一开始就将所需要的文件放到一个新建文件夹中再添加到项目中的原因。
解决办法:Targets->Build Settings->Header Search Path中添加1中建立的aliPaySDK的路径 (拖拽此文件夹至输入框即可)
2.服务器返回的签名处理
NSString *base64String = _aliPayItem.data.data_url.sign;//返回的签名
NSLog(@"base64--%@",base64String);
NSString *signedString = [self urlEncodedString:base64String];
- (NSString*)urlEncodedString:(NSString *)string
{
NSString * encodedString = (__bridge_transfer NSString*) CFURLCreateStringByAddingPercentEscapes(kCFAllocatorDefault, (__bridge CFStringRef)string, NULL, (__bridge CFStringRef)@"!*'();:@&=+$,/?%#[]", kCFStringEncodingUTF8 );
return encodedString;
}
3.订单重复
用的是公司内部服务器,换了域名不会。
4.回调跳转指定界面
在支付界面的支付宝回调方法的block块不进入,在appdelegate的回调block块会进入,但是不能写跳转到指定界面的方法,写了也没有作用,用通知的方法可以解决。
5.微信支付
调用微信支付只出现一个“确定按钮”,用从服务器返回的订单签名不能作为微信支付的请求参数,需要根据返回的参数进行二次加密(微信支付的官方demo是直接拿到服务器返回的参数进行调用微信支付,应该是返回的已经做了签名已经做了二次加密处理了)
//调起微信支付
PayReq* req = [[PayReq alloc] init];
req.partnerId = _weChatItem.mch_id;
req.prepayId = _weChatItem.prepay_id;
req.nonceStr = _weChatItem.nonce_str;
req.timeStamp = [self getCurrentTime].intValue;
NSLog(@"timeNow%u",(unsigned int)req.timeStamp);
req.package = @"Sign=WXPay";
//拼接字符串
NSString *stringA = [NSString stringWithFormat:@"appid=wxa8358476acdee501&noncestr=%@&package=%@&partnerid=%@&prepayid=%@×tamp=%u",req.nonceStr,req.package,req.partnerId,req.prepayId,(unsigned int)req.timeStamp];
NSLog(@"stringA%@",stringA);
// 再拼接key(唯一指定的)
NSString *stringSignTemp = [NSString stringWithFormat:@"%@&key=e80676f525c334b78c22aec043ed1f97",stringA];
NSLog(@"stringSingTemp%@",stringSignTemp);
//md5加密(可以参考:http://www.jianshu.com/p/10527bc0dde1)
//之前在别人的简书上找了篇md5加密的算法,在微信的官方在线验证发现对同一字符串加密的结果不一样。。。这个我md5算法亲测可靠!
NSString *sign = [Encryption md5:stringSignTemp];
req.sign = sign;
NSLog(@"sign--%@",sign);
NSLog(@"partid=%@\nprepayid=%@\nnoncestr=%@\ntimestamp=%ld\npackage=%@\nsign=%@",req.partnerId,req.prepayId,req.nonceStr,(long)req.timeStamp,req.package,req.sign );
[WXApi sendReq:req];