问题描述
h5页面点击微信支付跳转到微信app的时候显示商户支付下单ID非法,无法完成支付流程。
问题分析与解决
据调试发现,跳转微信时,也就是执行[[UIApplication sharedApplication] openURL:[NSURL URLWithString:requestUrl]时的url是编码过的。如:
weixin://wap/pay?prepayid%3Dwx21094105515649f5d998591a1564214100&package=3426540539&noncestr=1574300488&sign=9ec3a7ef14728b673f6c71572e8c3092
如果是是编码后的url执行openURL,跳转到微信,那么就会导致商户支付下单ID非法。所以在跳转之前对url进行urlDecode,再跳转。
由于之前使用一切正常,而现在出现了这个问题,那么就代表了app外部微信支付的某些逻辑发生了变化,而这会导致url在跳转前出现编码和未编码两种情况,为了兼容这两种情况,需要url特征做判断并进行解码,具体如下。
if ([requestUrl containsString:@"%3D"]) {
//如果跳转之前被转码了一次会出现id非法,微信支付失败,判断一下
//weixin://wap/pay?prepayid%3Dwx21094105515649f5d998591a1564214100&package=3426540539&noncestr=1574300488&sign=9ec3a7ef14728b673f6c71572e8c3092
requestUrl = [self URLDecodedString:requestUrl];
//weixin://wap/pay?prepayid=wx21094105515649f5d998591a1564214100&package=3426540539&noncestr=1574300488&sign=9ec3a7ef14728b673f6c71572e8c3092
}
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:requestUrl]];