微信支付之微信内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("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;
}
});
}
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;
}
});
}
阅读全文
0 0
- 微信支付之微信内H5调起支付
- Java微信支付开发之公众号支付(微信内H5调起支付)
- android 调起h5页面微信支付
- 微信支付之H5支付
- 微信支付 h5 支付
- android微信支付之调起支付和支付结果页面回调
- 微信支付 h5
- h5微信支付
- 微信h5支付
- 微信H5支付
- 微信h5支付
- Android微信支付 调起支付流程
- 微信支付调起支付控件一闪而过
- 微信支付 php之Android接口(调起支付)
- 微信支付H5调用支付详解
- laravel微信支付H5支付集成
- 微信支付【H5非微信内浏览器支付】
- 微信支付H5支付介绍
- java设计模式——单例模式
- NLP常用数据集
- STM32串口实现485双机通信原理
- 快速幂求法(二进制求解)java实现
- angularJS错误及其解决办法集
- 微信支付之微信内H5调起支付
- java 选择排序
- Crontab 命令详解
- iOS基础控件---UITextField
- OpenCV 实现分水岭算法
- JAVA微信公众号后台开发(一)
- scroll,resize一类事件的性能优化
- Hive修改表语句
- 各种网络汇总CNN、RNN、GAN…