官方文档:微信支付-开发者文档
官方说法:服务端调用下单接口后,将返回的 mweb_url 链接返回给客户端,让客户端调用该链接拉起微信支付,需要配置跳转地址的话,在链接后面带上 &redirect_url=跳转地址,不带则默认返回当前页面(iOS有问题,会跳域名,不带接口)
处理iOS 跳转问题:
服务端调用下单接口后,将返回的 mweb_url 链接在服务端请求一次,请求的时候要带请求头参数 Referer 值必须是你申请的支付白名单,会返回一个html页面,通过正则表达式获取 deeplink 后面的链接给客户端使用,会变成直接拉起微信支付,没跳中间页。 |
可以
private String readUrl(String mweb_url) throws Exception{
String regex = "deeplink : \"[^\"]+\"";
Pattern pattern = Pattern.compile(regex);
URL payUrl = new URL(mweb_url);
URLConnection con = payUrl.openConnection();
con.setRequestProperty("Referer", "https://aaa.com"); // 加referer防盗链,必须是你申请的支付白名单
BufferedReader br = new BufferedReader(new InputStreamReader(con.getInputStream(),"UTF-8"));
String result = "";
String realLineStr = null;
while((realLineStr = br.readLine()) != null){
Matcher matcher = pattern.matcher(realLineStr); // 一行行查找
if(matcher.find()){
result = matcher.group(); // 匹配deeplink
break; // 跳出循环
}
}
//deeplink:weixin://wap/pay?prepayid%3Dwx13204624745902b7939b944d06f8420000&package=953378881&noncestr=1663073184&sign=af6078942315921b9935480dd0836a77
//截取deeplink 的值,或者改一下正则表达式一次性获取
if(StringUtils.isEmpty(result) || result.length() < 11){
result = mweb_url;
}else{
String deeplink = result.substring(11).replace("\"","");
result = deeplink;
}
return result;
}