微信支付之微信内H5调起支付

来源:互联网 发布:2017年网络大电影榜单 编辑:程序博客网 时间:2024/04/30 05:34
微信支付主要就是
1.openId的获取
2.订单详情扩展字符串prepay_id的获取
3.签名paySign的生成


1.有订单号(tradeNo),openId以及金额(totalfee)
其中订单号生成方式(时间+6位随机数,自行解决)
String tradeNo = CommonUtil.getOrderNo();
openId获取方式另外讲解(自行百度,有2种方式)
金额由前端传入


2.生成预订单,主要为了获取到prepay_id(有人说获取到了相当于成功了一半,大实话)
jso = JSONObject.fromObject(wxPrePay(tradeNo, totalfee, openId));

private Map<String, Object> wxPrePay(String tradeNo, String price, String openId) throws Exception {
Map<String, Object> res = new HashMap<String, Object>();
//在微信后台生成预支付订单
Map<String, String> prePayPra = MyWXPayUtil.sendPrepay(tradeNo, price, openId);//sendPrepay写下面了
if (prePayPra.get("result_code").equals("SUCCESS")) {
//校验参数
if (WXPayCore.validateSign(prePayPra)) {
//校验成功
Map<String, String> param = new HashMap<String, String>();
String timeStamp = String.valueOf(System.currentTimeMillis() / 1000);
String nonceStr = UUID.randomUUID().toString().replace("-", "").substring(0, 16);
String package_str = "prepay_id=" + prePayPra.get("prepay_id");//此处获取到prepay_id
String signType = "MD5";
String appId = MyWXPayConfig.APPID;


param.put("timeStamp", timeStamp);
param.put("nonceStr", nonceStr);
param.put("package", package_str);
param.put("signType", signType);
param.put("appId", appId);
String paySign = WXPayCore.createMd5Sign(param);// 生成支付签名

// 生成需要返回给前端的支付签名
res.put("timeStamp", timeStamp);
res.put("nonceStr", nonceStr);
res.put("package", package_str);
res.put("paySign", paySign);
res.put("signType", signType);

res.put("appId", appId);

//主要是上面的6个参数

res.put("isPrey", true);
res.put("msg", "成功");
} else {
res.put("isPrey", false);
res.put("msg", "支付参数被修改!");
}
} else {
res.put("success", false);
res.put("msg", "生成支付订单失败!系统异常!");
}
return res;
}


// 提交预支付
public static Map<String, String> sendPrepay(String orderId,String price,String openId ) throws Exception {
// 订单信息---预付单参数订单设置
Map<String, String> packageParamsMap = new HashMap<String, String>();
BigDecimal totalFee =new BigDecimal(price);// 单位元,只能带两位小数
//生成支付签名需要的参数
packageParamsMap.put("appid", MyWXPayConfig.APPID);// 开放平台appid
packageParamsMap.put("mch_id", MyWXPayConfig.mchid);// 商户号
packageParamsMap.put("device_info", "WEB");// 支付设备号或门店号,选填
packageParamsMap.put("body", MyWXPayConfig.order_name);// 订单描述,展示给用户
packageParamsMap.put("nonce_str",String.valueOf(System.currentTimeMillis() / 1000));// 随机串,建议使用时间戳

//发起预支付需要的参数
packageParamsMap.put("openid", openId);// 微信用户在商户的唯一标识
packageParamsMap.put("trade_type", MyWXPayConfig.trade_type);// 支付类型,
packageParamsMap.put("out_trade_no", orderId);// 商户订单号
packageParamsMap.put("total_fee", totalFee.multiply($100).intValue()+"");// 订单金额,单位为分
packageParamsMap.put("spbill_create_ip", InetAddress.getLocalHost().getHostAddress());// 发器支付的机器ip
packageParamsMap.put("notify_url", MyWXPayConfig.notify_url);// 支付结果异步通知

//其他选填参数、
/*packageParamsMap.put("sign_type", "MD5");
packageParamsMap.put("detail", "MD5");
packageParamsMap.put("attach", "XX");
packageParamsMap.put("fee_type", "CNY");//默认人民币
packageParamsMap.put("time_start", "");//交易起始时间  yyyyMMddHHmmss
packageParamsMap.put("time_expire", "");//交易结束时间  yyyyMMddHHmmss
packageParamsMap.put("goods_tag", "");//优惠标记
packageParamsMap.put("limit_pay", "no_credit");//限制用户不能使用信用卡支付
packageParamsMap.put("scene_info", "{\"store_info\" : {\"id\": \"89999\",\"name\": \"xxxx\",\"area_code\": \"xxxxxxx\",\"address\": \"xxxxxx\"}}");
*/
String xmlValue = genPackage(packageParamsMap);
//统一下单支付请求
Map<String, String> resVal = doSendPost(MyWXPayConfig.pay_url, xmlValue,MyWXPayConfig.charset);
logger.info("微信返回" + resVal);
return resVal;
}

//最后把信息返回给页面返回的就是data
function onBridgeReady(data) {
    WeixinJSBridge.invoke('getBrandWCPayRequest', {
"appId":data.appId,
      "timeStamp": data.timeStamp,
      "nonceStr": data.nonceStr,
      "package": data.package,
      "signType": data.signType,
      "paySign": data.paySign
        },
       function(res){
$("#paybtn").removeAttr('disabled');
           if(res.err_msg == "get_brand_wcpay_request:ok") {//res.err_msg将在用户支付成功后返回ok,但并不保证它绝对可靠。 
          location.href='<%=basePath%>wechat/myorder.jsp';
           }else if(res.err_msg =="get_brand_wcpay_request:cancel"){
            //alert("支付取消,请及时去订单列表中重新支付!");
            mui.alert('支付取消,请及时去订单列表中重新支付!', '',function() {
            location.href='<%=basePath%>wechat/myorder.jsp';
});
           
           }else if(res.err_msg =="get_brand_wcpay_request:fail" ){
            //alert("支付失败,联系管理员!");
            mui.alert('支付失败,联系管理员!', '',function() {
});
            return;
           }
           
       });
        
}
原创粉丝点击