用户在微信打开浏览器访问网站,进行支付宝或者微信H5支付,页面提示跳转到浏览器操作。
此后,跳转到浏览器后用户就是非登录状态,还得重新登录支付,这该怎么解决?
使用的iframe,腾讯并没有屏蔽数据传输层。只是屏蔽了当前URL。
不是应该接支付宝或者微信支付的接口,直接打开app支付吗?为什么要跳到浏览器?你这个想法有问题呀
用户注册的时候和微信APPID绑定下,跳到H5的时候,获取下appid参数自动登录
都知道支付宝支付在不同环境下分好多种,本文介绍的是<手机网页即时到账接口-手机网页即时到账接口>如何接入。至于如何开通支付宝,审核等步骤,请查阅其他文档。本文使用的是其中JAVA版接入。
由于微信“封杀”了支付宝支付,支付宝给出了<关于微信公众平台无法使用支付宝收付款的解决方案说明>解决方案,本文介绍如何接入。
文档中,主要有用的是2个文件pay.html、ap.js.另外两个demo_get.htm,demo_post.htm是测试用例。
接入参考demo_get.htm,主要遇到的问题:
1.代码pay.htm有小错误
2.引入路径问题
3.如何引入ap.js和参数加引号
4.URLEncoder
解决:
1.代码pay.htm有错:
第四行修改为
2.引入路径问题:
如果是使用的JAVA版接入微信,且使用JSP方式生成自动submit的表单内容。那么请在JSP存放的路径拷贝进去pay.html、ap.js两个文件。
3.如何引入ap.js和参数加引号:
如何引入ap.js
[java] view plain copy
/**
* 建立请求,以表单HTML形式构造(默认)
* @paramALIPAY_GATEWAY_NEW 支付宝网关地址
* @param sParaTemp 请求参数数组
* @param strMethod 提交方式。两个值可选:post、get
* @param strButtonName 确认按钮显示文字
* @return 提交表单HTML文本
*/
public static String buildRequest(String ALIPAY_GATEWAY_NEW, Map sParaTemp, String strMethod, String strButtonName) {
//待请求参数数组
Map sPara = buildRequestPara(sParaTemp);
List keys = new ArrayList(sPara.keySet());
StringBuffer sbHtml = new StringBuffer();
//添加微信 兼容性
sbHtml.append("<script type='text/javascript' src='ap.js'></script>");
sbHtml.append("<form id=\"alipaysubmit\" name=\"alipaysubmit\" action=\"" + ALIPAY_GATEWAY_NEW
+ "_input_charset=" + AlipayConfig.input_charset + "\" method=\"" + strMethod
+ "\">");
for (int i = 0; i < keys.size(); i++) {
String name = (String) keys.get(i);
String value = (String) sPara.get(name);
sbHtml.append("<input type=\"hidden\" name=\"" + name + "\" value=\"" + value + "\"/>");
}
//submit按钮控件请不要含有name属性
sbHtml.append("<input type=\"submit\" value=\"" + strButtonName + "\" style=\"display:none;\" onclick=\"sendTo()\"></form>");
String prestr = createLinkStr(sPara);
String str = ALIPAY_GATEWAY_NEW + prestr;
sbHtml.append("<script>function sendTo(){"
+ "_AP.pay(\""+ str +"\");"
+ "};sendTo();</script>");
/* sbHtml.append("");
sbHtml.append("document.forms['alipaysubmit'].submit();");*/
return sbHtml.toString();
}
public static String createLinkStr(Map<String, String> params) {
List<String> keys = new ArrayList<String>(params.keySet());
Collections.sort(keys);
String prestr = "";
for (int i = 0; i < keys.size(); i++) {
String key = keys.get(i);
String value = params.get(key);
try {
value = URLEncoder.encode(value, AlipayConfig.input_charset);
} catch (UnsupportedEncodingException e) {
}
if (i == keys.size() - 1) {//拼接时,不包括最后一个&字符
prestr = prestr + key + "=" + value;
} else {
prestr = prestr + key + "=" + value + "&";
}
}
return prestr;
}
代码片段 + "_AP.pay(\""+ str +"\");" 中 str 变量两侧要有 \" ,不光是str变量要是字符串,还要用引号包起来。
4.URLEncoder
createLinkStr方法是拼装字符串的作用,拼装的同时,要为每个value都进行URLEncoder.encode
用户跳转前把appId及登录标识 传进页面的变量,跳转后根据appid判定是否登录
可以去找下集成好的支付平台
跳转前把appId及登录标识 传进页面的变量,跳转后根据appid判定是否登录
微信服务器不会向客户端发送cookie,所以session会失效,你的登录就会出问题,所以session和微信支付不能直接用session来做,要处理一下
我在微信里面的H5中实现支付宝支付的方式如下:
1、在H5界面提供了支付宝支付的方式
2、当使用支付宝支付,点击提交的时候,使用支付宝提供的pay.htm和ap.js进行跳转(get方式)
3、get方式是自己拼接的url
_AP.pay(ApiConf.server +
"OnlinePayment/onlinePay?token=" + ApiConf.token +
"&payType=" + payType +
"&totalAmount=" + totalAmount +
"&body=" + body);
4、在后台通过token校验以及是哪个用户进行支付
5、调用支付宝SDK生成支付表单
6、通过浏览器或者支付宝App支付
7、回调进入支付成功的界面(失去连接),需要重新登录