Android应用集成微信支付,有常用的APP支付和H5支付2种
- APP支付:体验好,集成相较H5麻烦点
- H5支付:无需申请走APP支付的流程(包括应用主体一致等要求)
微信支付,现在总结来看,无非几步
1. 申请开发者账号,获取APP ID, APP Secrct,以及商户支付Key
2. 客户端请求自己服务端,自己服务端通过APP ID等生成客户端请求sign,然后返回给客户端
3. 客户端在组装APP ID,商户支付Key,支付签名sign等请求微信支付SDK
4. 然后在通过支付SDK回调处理各种后续逻辑
具体集成可参考微信开放平台支付SDK
本篇文章记录集成H5支付时一个问题
https://pay.weixin.qq.com/wiki/doc/api/H5.php?chapter=15_4
提示:商家参数格式有误,请联系商家解决
原因:H5的WebView在调起微信支付时,需要对url进行个性化处理
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
boolean isHandleByHostApp = true;
// 微信H5支付核心代码
try {
if (url.startsWith("weixin://wap/pay?")) {
try {
Intent intent = new Intent();
intent.setAction(Intent.ACTION_VIEW);
intent.setData(Uri.parse(url));
mWeb.getActivity().startActivity(intent);
} catch (Exception e) {
e.printStackTrace();
}
return true;
} else if (url.contains("wx.tenpay.com")) {
Map<String, String> extraHeaders = new HashMap<>();
extraHeaders.put("Referer", UrlPools.getHostUrl());
view.loadUrl(url, extraHeaders);
return true;
}
} catch (Exception e) {
e.printStackTrace();
}
return isHandleByHostApp;
}
@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
@Override
public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {
boolean isHandleByHostApp = true;
String url = request.getUrl().toString();
// 微信H5支付核心代码
try {
if (url.startsWith("weixin://wap/pay?")) {
try {
Intent intent = new Intent();
intent.setAction(Intent.ACTION_VIEW);
intent.setData(Uri.parse(url));
mWeb.getActivity().startActivity(intent);
} catch (Exception e) {
e.printStackTrace();
}
return true;
} else if (url.contains("wx.tenpay.com")) {
Map<String, String> extraHeaders = new HashMap<>();
extraHeaders.put("Referer", UrlPools.getHostUrl());
view.loadUrl(url, extraHeaders);
return true;
}
} catch (Exception e) {
e.printStackTrace();
}
return isHandleByHostApp;
}
注意,这2个方法都需要个性化判断处理