H5支付参考:https://blog.youkuaiyun.com/zhuwei_clark/article/details/108242556
对于公众号支付,需要注意细节:
public WXPay(final WXPayConfig config, final String notifyUrl, final boolean autoReport, final boolean useSandbox) throws Exception {
this.config = config;
this.notifyUrl = notifyUrl;
this.autoReport = autoReport;
this.useSandbox = useSandbox;
if (useSandbox) {
this.signType = SignType.MD5; // 沙箱环境
}
else {
this.signType = SignType.MD5;
}
this.wxPayRequest = new WXPayRequest(config);
}
不然会出现签名不对的情况
至于Java集成公共号支付其实代码还是挺简单
public Map<String,String> jsPay(H5OrderDto orderDto,String code) {
String openId = openIdService.getOpenIdByCodeZZH(code,wxPay.getConfig().getAppID(),wxPay.getConfig().getAppSecret());
//参数名称对应的参数值
Map<String,String> valueMap = new HashMap();
//公众号
valueMap.put("appid", wxPay.getConfig().getAppID());
//商户号
valueMap.put("mch_id", wxPay.getConfig().getMchID());
//设备信息
valueMap.put("device_info", "WEB");
//随机字符串
valueMap.put("nonce_str", PayUtil.getRandom());
//签名类型
valueMap.put("sign_type", "MD5");
//商品描述
valueMap.put("body", orderDto.getBody());
//订单号
valueMap.put("out_trade_no", orderDto.getOrderId());
//价格
valueMap.put("total_fee",String.valueOf(orderDto.getPrice()));
//终端IP
valueMap.put("spbill_create_ip",orderDto.getIp());
//回调地址
valueMap.put("notify_url", orderDto.getCallBackUrl());
//交易类型
valueMap.put("trade_type", "JSAPI");//公众号支付
//商品编号
valueMap.put("product_id", orderDto.getProductId());//公众号支付
//openID
valueMap.put("openid", openId);
//回传参数
valueMap.put("attach", orderDto.getAttach());
//获取请求报文
Map<String, String> result = null;
try {
result = wxPay.unifiedOrder(valueMap);
}catch (Exception e){
e.printStackTrace();
log.error("下单出错!");
throw new PayException("下单失败");
}
if(result!=null&&WXPayConstants.SUCCESS.equals(result.get("return_code"))){
Map<String,String> params = getResult(result.get("prepay_id"));
params.put("openId",openId);
return params;
}
throw new PayException("下单失败");
}
/**
* 前端返回结果处理
* @param prepayId
* @return
*/
private Map<String,String> getResult(String prepayId){
//参数名称对应的参数值
Map<String,String> valueMap = new HashMap();
//公众号
valueMap.put("appId", wxPay.getConfig().getAppID());
//时间戳
valueMap.put("timeStamp", System.currentTimeMillis()/1000+"");
//随机字符串
valueMap.put("nonceStr", PayUtil.getRandom());
//签名类型
valueMap.put("signType", "MD5");
//扩展字段
valueMap.put("package", "prepay_id="+prepayId);
//获取签名
try {
String paySign = WXPayUtil.generateSignature(valueMap, wxPay.getConfig().getKey(), WXPayConstants.SignType.MD5);
valueMap.put("paySign", paySign);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return valueMap;
}
基本上这样处理就完事了,然后就是前端代码,这个也相对于来说比较简单
//初始化支付方法
function onBridgeReady(param){
WeixinJSBridge.invoke(
'getBrandWCPayRequest', {
"appId":param.appId, //公众号名称,由商户传入
"timeStamp":param.timeStamp, //时间戳,自1970年以来的秒数
"nonceStr":param.nonceStr, //随机串
"package":param.package,
"signType":param.signType, //微信签名方式:
"paySign":param.paySign //微信签名
},
function(res){
if(res.err_msg == "get_brand_wcpay_request:ok" ) {// 使用以上方式判断前端返回,微信团队郑重提示:res.err_msg将在用户支付成功后返回 ok,但并不保证它绝对可靠。
order_status(param.pkOrder);
}else{
window.location.href = window.location.href;
}
}
);
}
这里最重要的是注意参数名称和大小写的问题。
还是就是前端所有的参数都是后台返回的,不要前端自己缓存