微信支付主要就是
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;
           }
           
       });
        
}

微信支付之微信内H5调起支付相关推荐

  1. java微信内h5调起支付_java微信支付--------公众号内H5调起支付

    /*** 统一下单接口,获取prepay_id *@paramrequest *@return */@RequestMapping(value= "/unifiedOrder", ...

  2. java微信公众号支付开发平台_Java微信公众平台开发之公众号支付(微信内H5调起支付)...

    官方文档 准备工作:已通过微信认证的公众号,必须通过ICP备案域名(否则会报支付失败) 借鉴了很多大神的文章,在此先谢过了 整个支付流程,看懂就很好写了 一.设置支付目录 在微信公众平台设置您的公众号 ...

  3. Java微信支付开发之公众号支付(微信内H5调起支付)

    官方文档 准备工作:已通过微信认证的公众号,必须通过ICP备案域名(否则会报支付失败) 借鉴了很多大神的文章,在此先谢过了 整个支付流程,看懂就很好写了 一.设置支付目录 在微信公众平台设置您的公众号 ...

  4. 微信h5 签名错误 php,【微信jsApi 支付】微信内H5调起支付时,提示“验证签名失败”...

    1) 使用微信的在线签名工具检查签名是否和程序生成的一致 选择MD5,XML,然后把请求参数xml放进去,就能校验签名. 2)如果和微信的在线签名工具一致,说明程序没有错误,确定是API密钥错误(被别 ...

  5. java微信内h5调起支付_java进行微信h5支付开发

    最近在做微信支付开发用的框架是 srpingMVC mybatis spring 下面是开发流程图 我们只需要开发红色标记的模块就可以了. 具体参数详情可以查看微信开发者文档. 新手第一次写,写的不好 ...

  6. h5微信本地调试 vue_Vue 移动端微信内H5调起支付(利用js sdk)

    前端的写法 1.封装wxPay.js import wx from 'weixin-js-sdk' //先下载后引入 export function wexinPay(data) { return n ...

  7. 企业号微信支付 公众号支付 H5调起支付API示例代码 JSSDK C# .NET

    企业号微信支付 公众号支付 H5调起支付API示例代码 JSSDK C# .NET 原文:企业号微信支付 公众号支付 H5调起支付API示例代码 JSSDK C# .NET 先看效果 1.本文演示的是 ...

  8. 微信网页和app内h5页获取当前定位保持一致

    Q:微信网页调用jssdk内的getLocation方法和客户端内封装的高德获取定位获取到的当前定位不一致,计算出的远近排序不一致. A:getLocation方法,type用gcj02.isHigh ...

  9. Vue 微信开发,微信内H5调起微信支付

    注意:打包后的Vue URL 需要在微信公众平台设置好JS安全域名 <template><div class="icontent"><h3 style ...

最新文章

  1. AngularJS ng-if使用
  2. JavaScript基础:(加号,数值转换,布尔转换)
  3. OpenSSL 编程 - RSA 加密解密
  4. java 反编译项目_Java 7 –反编译项目硬币
  5. loss function
  6. js eval()函数
  7. 人工智能时代来临,还需要那么多人吗?
  8. oracle创建目录的命令,使用create database命令手工创建Oracle数据库
  9. 搜索框,输入关键字过滤对象数组
  10. 【软件测试】验收测试是以最终用户为主的测试
  11. iframe框架_性能优化去除iframe脚手架升级方案
  12. ubuntu安装配置ssmtp
  13. 北京理工大学—计算机专业课程资源
  14. java面试题:数组的常用算法实现
  15. 三轴加速度传感器和六轴惯性传感器_六轴传感器和三轴传感器的区别在哪
  16. Python练习---turtle绘图之绘制天安门
  17. 使用docker安装mysql5.7
  18. 关于android系统的介绍
  19. GIS开发:分享NASA火灾地图(FIRMS Fire Map)
  20. 2208988800一个奇怪的数字

热门文章

  1. 戏说前端之CSS编码规范
  2. PHP 发送手机短信验证
  3. 黑客入门——手机wifi定位原理
  4. 真的,程序员别去外包公司|程序员有话说
  5. 学习java的心得体会_学习java的心得体会范文.doc
  6. Error (176310): Can't place multiple pins assigned to pin location Pin_F16
  7. C语言 希尔排序 使用监视哨
  8. 图像平铺_制作无缝平铺图像的五个步骤
  9. 什么时候用到全排列_【什么情况下要除以一个全排列?举例说明最好,万分感激,】作业帮...
  10. React Native 0.59.x新特性解读