微信支付

来源:互联网 发布:淘宝转化率怎么算 编辑:程序博客网 时间:2024/06/06 02:58

微信支付分为:公众号支付,扫码支付,刷卡支付三种,目前中使用过公众号支付一种;

公众号支付:

使用微信支付首先要访问统一下单接口产生一个预支付ID,然后才能调用微信支付接口进行支付,还需要进行网页授权获取用户信息

/**
* 调用统一下单接口,获取预支付ID
* */
String nonce_str = UUID.randomUUID().toString().substring(0, 31);
String mch_id = WxPayConfig.PARTNER;
//商户ID(申请微信支付接口 成功之后在发送到额)
String body =  "费用支付";
//在支付时显示的信息
String orderNo = WxPayConfig.APPID + Sha1Util.getTimeStamp();
//订单号,自己可以随机生成,在开发文档上有具体的介绍
int totle_fee = 1; //总金额以分为单位
String spbill_create_ip = request.getRemoteAddr();
//获取请求的ID
String notify_url ="http://www.jiaqiankun.site/imessage/wechat/pay/notify";
//回调的URL
String trade_type = "JSAPI";
//支付的类型,因为用的是公众号支付,所以这儿的值固定为‘JSAPI’
String openid = openId;
//获取的用户的OPENID,关于如何通过网页授权获取用户信息在开发文档上有
SortedMap<String, String> packageParams = new TreeMap<String, String>();
packageParams.put("appid", WxPayConfig.APPID);  
packageParams.put("mch_id", mch_id);  
packageParams.put("nonce_str", nonce_str);  
packageParams.put("body", body);  
packageParams.put("out_trade_no", orderNo);  
packageParams.put("total_fee", total_fee);  
//这里写的金额为1 分到时修改
packageParams.put("spbill_create_ip", spbill_create_ip);  
packageParams.put("notify_url", notify_url);  
packageParams.put("trade_type", trade_type);  
packageParams.put("openid", openid);  


RequestHandler reqHandler = new RequestHandler(request, response);
reqHandler.init(WxPayConfig.APPID, WxPayConfig.APPSECRET, WxPayConfig.PARTNERKEY);
String sign = reqHandler.createSign(packageParams);
//构造签名

String xml="<xml>"+
"<appid>"+WxPayConfig.APPID+"</appid>"+
"<mch_id>"+mch_id+"</mch_id>"+
"<nonce_str>"+nonce_str+"</nonce_str>"+
"<sign>"+sign+"</sign>"+
"<body><![CDATA["+body+"]]></body>"+
"<out_trade_no>"+orderNo+"</out_trade_no>"+
"<total_fee>"+1+"</total_fee>"+
"<spbill_create_ip>"+spbill_create_ip+"</spbill_create_ip>"+
"<notify_url>"+notify_url+"</notify_url>"+
"<trade_type>"+trade_type+"</trade_type>"+
"<openid>"+openid+"</openid>"+
"</xml>";

//统一支付接口url
String createOrderURL = "https://api.mch.weixin.qq.com/pay/unifiedorder";
预支付ID
String prepay_id="";

try{
prepay_id = new GetWxOrderno().getPayNo(createOrderURL, xml);
if(prepay_id.equals("")){
System.out.println("统一下单接口出现错误");
}
}catch(Exception e){
e.printStackTrace();
System.out.println("统一下单接口测试失败!");
}

统一下单执行成功之后,调用JSAPI进行支付
SortedMap<String, String> finalpackage = new TreeMap<String, String>();
finalpackage.put("appId", WxPayConfig.APPID);
finalpackage.put("timeStamp", Sha1Util.getTimeStamp());
finalpackage.put("nonceStr", UUID.randomUUID().toString().substring(0, 31));
finalpackage.put("package", "prepay_id="+prepay_id);
finalpackage.put("signType", "MD5");
String finalsign = reqHandler.createSign(finalpackage);

try {
response.sendRedirect(path+"/jsp/wechat/pay/weChatPay.jsp?appid="+finalpackage.get("appId")+"&timeStamp="+finalpackage.get("timeStamp")+"&nonceStr="+finalpackage.get("nonceStr")+"&package="+finalpackage.get("package")+"&sign="+finalsign);
} catch (IOException e) {
e.printStackTrace();
}


JSP内容:

<script type="text/javascript">
  window.onload=function (){
WeixinJSBridge.invoke('getBrandWCPayRequest',{
  "appId" : "<%=appId%>","timeStamp" : "<%=timeStamp%>", "nonceStr" : "<%=nonceStr%>", "package" : "<%=packageValue%>","signType" : "MD5", "paySign" : "<%=paySign%>" 
    },function(res){
WeixinJSBridge.log(res.err_msg);
  //alert(res.err_code + res.err_desc + res.err_msg);
        if(res.err_msg == "get_brand_wcpay_request:ok"){  
                alert("支付成功!");
          }else if(res.err_msg == "get_brand_wcpay_request:cancel"){  
                alert("取消支付!");  
          }else{
              alert("支付失败!");  
          }  
})
}
  </script>

在使用以上这种这种方式微信支付的时候,需要在微信后台设置支付测试的URL和支付测试的白名单,但是那个生效需要一段时间,具体时间是多少 没有进行测试,但是请相信,这个和域名是否备案什么乱七八糟的没有任何关系!上面的DEMO缺少一些工具类,可以前往  http://download.csdn.net/detail/qq_16071145/9514935    这个地址下载完整的资料

0 0
原创粉丝点击