java微信H5支付中遇到的问题都已解决 java代码 和html代码
1,开通账号,申请商户账号 打开连接https://pay.weixin.qq.com/index.php/partner/public/home (如图1)
(图1)
2,完成注册以后登录 进入(图2)
(图2)
点击H5支付开通
3,如果已开通 (如图3)
(图3)
4点击开发配置菜单(如图4)添加域名,域名必须是备案过的
完了就可以开发了
下面是我的代码很简单
package controllers.payment.wechat;
import com.jpay.weixin.api.WxPayApi;
import com.jpay.weixin.api.WxPayApiConfig;
import constants.payment.MerchantAccountConstants;
import org.jdom.JDOMException;
import play.Logger;
import play.Play;
import playecsp.constants.EcspConstants;
import playecsp.controllers.EcspController;
import service.payment.IAliPayService;
import util.payment.H5ScencInfo;
import util.payment.HttpUtils;
import util.payment.PayCommonUtils;
import java.math.BigDecimal;
import javax.inject.Inject;
import java.io.IOException;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
/**
* 微信支付服务
* Created by on 2016/11/24.
*/
@playecsp.annotations.EcspController(name = "微信支付")
public class H5WechatPayment extends EcspController {
@Inject
private static IAliPayService aliPayService;
private static final String appID="xxxxx";//此处填写申请的appID
private static final String mchID="1489896702";//此处填写申请商户号
private static final String partnerKey="OYLBnUzRJw1qKgNXjY7akBQabbwgUFlO";//此处填写key
private static String notify_url = "http://ftrain.yladc.com/fsp/wxpay/wxPayRecallForH5";//次处填写你的回调地址域名必须和上面图4出一样
private static String name = "";
public static WxPayApiConfig getApiConfig() {
return WxPayApiConfig.New()
.setAppId(appID)
.setMchId(mchID)
.setPaternerKey(partnerKey)
.setPayModel(WxPayApiConfig.PayModel.BUSINESSMODEL);
}
public static void wapPayH5(BigDecimal totalPriceReal) throws Exception, IOException{
System.out.println("--pay start--");
String ip = PayCommonUtils.getHostIP();//终端Ip必须和域名绑定的机器上的外网Ip一致,网络环境未能通过安全验证,请稍后再试的错误
// 获取终端 IP
if (ip.isEmpty()) {
ip = "127.0.0.1";
}
Integer totalPriceRealTurn=0;
if(totalPriceReal!=null && !totalPriceReal.equals("")){
totalPriceRealTurn= totalPriceReal.multiply(BigDecimal.valueOf(100)).intValue();
}else{
renderEcspJson("", "wechatPayment", EcspConstants.FAIL, "请输入金额");
}
//组装信息
H5ScencInfo sceneInfo = new H5ScencInfo();
H5ScencInfo.H5 h5_info = new H5ScencInfo.H5();
//场景类型
h5_info.setType("Wap");
//WAP网站URL地址
h5_info.setWap_url(notify_url);
//WAP网站名
h5_info.setWap_name(name);
sceneInfo.setH5_info(h5_info);
//WxPayApiConfig wxPayApiConfig=getApiConfig();
Map<String, String> params=WxPayApiConfig.New()
.setAppId(appID)//支付appId
.setMchId(mchID)//商户号
.setBody("H5支付测试")//商品描述
.setSpbillCreateIp(ip)//终端IP
.setTotalFee(totalPriceRealTurn.toString())//总金额
.setTradeType(WxPayApi.TradeType.MWEB)//交易类型
.setNotifyUrl(notify_url)//回调地址
.setPaternerKey(partnerKey)//订单号
.setOutTradeNo(String.valueOf(System.currentTimeMillis()))//订单号
.setSceneInfo(sceneInfo.toString())//场景信息
.setAttach("H5支付测试")//附加数据
.build();
String xml= mapToXml(params);
//调用微信统一下单接口
String resData = HttpUtils.sendReqForPost(xml.toString());
//解析返回xml成map
Map<String, String> map = new HashMap<String, String>();
map = PayCommonUtils.doXMLParse(resData);
if ("SUCCESS".equals(map.get("return_code")) && "SUCCESS".equals(map.get("result_code"))) {
Logger.info(" order of weixin is successful :::" + map.get("code_url"));
//向应用返回唤起链接mweb_url
Map<String, String> retData = new HashMap<String, String>();
retData.put("mweb_url", map.get("mweb_url"));
retData.put("prepay_id", map.get("prepay_id"));
renderEcspJson(retData, "wechatPayment", EcspConstants.SUCESS, "");
} else {
renderEcspJson("", "wechatPayment", EcspConstants.FAIL, map.get("return_msg"));
}
}
/**
* map 转 xml
*
* @param map
* @return
*/
private static String mapToXml(Map<String, String> map) {
StringBuffer sf = new StringBuffer("<xml>");
Iterator<Map.Entry<String, String>> iterator = map.entrySet().iterator();
while (iterator.hasNext()) {
Map.Entry<String, String> entry = iterator.next();
String key = entry.getKey();
String value = entry.getValue();
sf.append("<" + key + ">" + value + "</" + key + ">");
}
sf.append("</xml>");
return sf.toString();
}
/**
* h5信支付异步回调方法
* Created by lpp on 2018/6/1.
*/
public static void wxPayRecallForH5() throws IOException, JDOMException, InterruptedException {
Logger.info(":::weixin pay of wxPayRecallForH5 recall :::");
}
}
html代码
<!DOCTYPE html>
<html lang="zh-cn">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>h5支付</title>
<link href="${ctx}/admin/css/common/bootstrap.css" rel="stylesheet">
<link href="${ctx}/admin/css/common/font-awesome.min.css" rel="stylesheet">
<!-- Expand styles -->
<link href="${ctx}/admin/css/common/ecsp-ext.css" rel="stylesheet">
<link href="${ctx}/admin/css/common/ecsp-size.css" rel="stylesheet">
<link href="${ctx}/admin/css/common/ecsp-plugin.css" rel="stylesheet">
<!-- Custom styles for this template -->
<link rel="stylesheet" type="text/css" href="${ctx}/admin/css/theme/default_theme.css">
<link href="${ctx}/lib/layer/skin/layer.css" rel="stylesheet">
</head>
<body>
<div class="login-container animated fadeInDown" style="text-align: center">
请输入金额:<input type="text" id="totalPriceReal"><br/>
<br/>
<input type="button" value="去支付" onclick="submintPay()">
</div>
<script src="${ctx}/js/jquery.min.js"></script>
<script src="${ctx}/js/bootstrap.min.js"></script>
<script>
function submintPay(){
var totalPriceReal=$("#totalPriceReal").val();//商品金额
var reg = /(^[1-9]([0-9]+)?(\.[0-9]{1,2})?$)|(^(0){1}$)|(^[0-9]\.[0-9]([0-9])?$)/;
if (reg.test(totalPriceReal)) {
var orderIofn={
"totalPriceReal":totalPriceReal
};
$.ajax({
url:"/fsp/wxpay/wapPayH5",
data:orderIofn,
type: "POST",
async: false,
success:function(data){
if(data.header.retCode=='000000'){
// alert(JSON.stringify(data));
//支付唤起微信连接
var mweb_url=data.body.mweb_url;
//支付完成连接
var mweb_complete_url="http://ftrain.yladc.com/fsp/wechatpay/gotoPayCompletion";
self.location.href=mweb_url+"&redirect_url="+mweb_complete_url;
}else{
//alert(JSON.stringify(data));
}
},
error:function(){
layer.close(load_index);
layer.msg("删除失败");
}
});
}else{
alert("请输入合法金额");
};
}
</script>
</body>
</html>