手机调起微信支付
上篇更新的博客中介绍了手机网站调起支付宝,这一篇介绍一下手机端调起微信支付
项目需求:
1.在浏览器外部唤醒手机端的微信应用
2.实现微信支付
3.修改数据库订单的状态值
一.准备工作
微信支付用户开发文档
微信支付商户平台
微信支付相关参数的获取
需要获取的参数
1.微信公众号身份的唯一标识:appid
2.受理商ID,身份标识(商户id):mchid
3.商户支付密钥Key(这个需要商户自己设置):partner.key
4.微信支付成功回调地址:notify.url
二.代码实现
注意:此时我还是在测试环境中,所以回调地址使用的是内网穿透
natapp.cn
1.BeginController.java
@RequestMapping("/wx")
public String wx(Model model,@RequestParam("oid") String oid){
//根据id找对象
OrderMaster orderMaster=orderMasterMapper.selectById(oid);
Integer value1=orderMaster.getOrderMoney().intValue();
model.addAttribute(orderMaster);
model.addAttribute(value1);
System.out.println(orderMaster);
System.out.println(value1);
return "pay";
}
2.pay.html
<!DOCTYPE html>
<html xmlns:th="http://www.w3.org/1999/xhtml">
<head>
<meta charset="UTF-8">
<title>微信支付</title>
<base href="http://mkqy.natapp1.cc/">
<script src="https://code.jquery.com/jquery-3.1.1.min.js"></script>
</head>
<body>
<input type="hidden" th:value="${orderMaster.orderId}" id="oid"/>
<input type="hidden" th:value="${orderMaster.orderMoney}" id="value"/>
</body>
<script type="text/javascript">
var oid=$("#oid").val();
var value=$("#value").val();
alert(value);
$.ajax({
type : "POST",
data:{
"oid":oid,
"value":value
},
//这里换成你自己的项目请求路径
url : "/pay/wxpay?oid="+oid+"&value="+value,
success:function(data){
console.log(data);
window.location.href=data;
}
});
</script>
</html>
3.WxpayController.java
@ResponseBody
@RequestMapping(value = "/wxpay", method = RequestMethod.POST)
public String wxpay(Model model,HttpServletRequest request, HttpServletResponse response, @RequestParam("oid")String oid, @RequestParam("value") Integer value) throws Exception {
/**
*加载配置文件中的商户参数
*/
String appID = ResourcesUtil.getValue("config", "wxpay.appid");
String mchID = ResourcesUtil.getValue("config", "wxpay.mchid");
String partnerKey = ResourcesUtil.getValue("config", "wxpay.partner.key");
String oid1=oid.substring(0,20);
System.out.println("====>oid"+oid);
System.out.println("====>oid1"+oid1);
String notifyUrl =ResourcesUtil.getValue("config","wxpay.notify.url");
//ResourcesUtil.getValue("config","wxpay.notify.url");
//获取会员ip地址(有的手机可以直接获取到真实ip,大部分都是有代理的)
String ip = IPUtils.getIp(request);
System.out.println("此时用户的手机对应的ip地址是:"+ip);
// 加载场景信息(可以直接写成Json字符串,我这里处理了一下)
H5ScencInfo scene = new H5ScencInfo();
H5ScencInfo.H5 h5_info = new H5ScencInfo.H5();
h5_info.setType("WAP");
h5_info.setWap_url("http://mkqy.natapp1.cc");
h5_info.setWap_name("皮皮萍");
scene.setH5_info(h5_info);
String sceneInfo = scene.toString();
/**
* 拼接微信微信支付参数
*/
WxPayApiConfig params = WxPayApiConfig.New();
//AppId
params.setAppId(appID);
//商户号
params.setMchId(mchID);
//商品简单描述(订单名)
params.setBody(oid1);
//用户端IP
params.setSpbillCreateIp(ip);
//订单总金额,单位为分 (momey* 100).toFixed()
//BigDecimal val=new BigDecimal(100);
params.setTotalFee(String.valueOf(value*100));
//H5支付的交易类型为MWEB(默认)
params.setTradeType(WxPayApi.TradeType.MWEB);
//微信支付成功后的回调Url
params.setNotifyUrl(notifyUrl);
//商户秘钥
params.setPaternerKey(partnerKey);
//随机字符串,不长于32位(我这里直接获取当前时间毫秒值)
params.setOutTradeNo(String.valueOf(System.currentTimeMillis()));
//场景信息Json字符串
params.setSceneInfo(sceneInfo);
params.setAttach(oid1);
System.out.println(params);
Map<String, String> build = params.build();
System.out.println("build===>"+build);
//build.put("Dingdan",oid1);
/**
*直接用微信统一下单工具类,并接收返回的Xml,返回内容详见微信支付开发文档
*/
String xmlResult = WxPayApi.pushOrder(false, build);
Map<String, String> result = PaymentKit.xmlToMap(xmlResult);
System.out.println("@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@");
System.out.println("===>1"+result);
System.out.println("@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@");
//返回状态码
String return_code = result.get("return_code");
//返回状态码
String return_msg = result.get("return_msg");
//业务结果
String result_code = result.get("result_code");
if (!PaymentKit.codeIsOK(return_code)){
throw new RuntimeException(return_msg);
}
if (!PaymentKit.codeIsOK(result_code))
throw new RuntimeException(return_msg);
/**
*mweb_url为拉起微信支付收银台的中间页面,可通过访问该url来拉起微信客户端,完成支付,mweb_url的有效期为5分钟。
*直接return给前端,调用该链接会直接拉起微信支付(!!!微信外浏览器调用!!!)
*/
String mwebUrl = result.get("mweb_url");
//return mwebUrl+"&redirect_url=http://geekcjj.natapp1.cc/notify/update?oid="+oid1;
//https://www.baidu.com/
//response.setHeader("oid",oid1);
return mwebUrl;
//+"&redirect_url=http://mkqy.natapp1.cc/notify/update?oid="+oid1;
/*
*
* mwebUrl+"&redirect_url=http://mkqy.natapp1.cc/notify/update?oid="+oid1;
* */
}
4.WxPaidController.java
@ResponseBody
@RequestMapping(value = "/page")
public String notify(HttpServletRequest request) {
//@RequestParam("oid") String oid
// 接收微信发返回的Xml文件并转成Map<String, String>
System.out.println("{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}");
//System.out.println("oid===>"+oid);
System.out.println(request);
String xmlMsg = HttpKit.readData(request);
Map<String, String[]> maps = request.getParameterMap();
System.out.println("maps===>"+maps);
System.out.println("xmlMsg===>"+xmlMsg);
Map<String, String> params = PaymentKit.xmlToMap(xmlMsg);
Set<String> set=params.keySet();
/**
* 常用的参数,详情参考微信支付开发文档
*/
//返回已经支付的订单编号
String orderId=params.get("attach");
// 返回状态码
String result_code = params.get("result_code");
// 总金额
String total_fee = params.get("total_fee");
// 现金支付金额
String cash_fee = params.get("cash_fee");
// 微信支付订单号
String transaction_id = params.get("transaction_id");
// 商户订单号
String out_trade_no = params.get("out_trade_no");
// 支付完成时间,格式为yyyyMMddHHmmss
String time_end = params.get("time_end");
System.out.println("已支付订单对应的编号是;"+orderId);
System.out.println("状态码=" + result_code);
System.out.println("总金额=" + total_fee);
System.out.println("现金支付金额=" + cash_fee);
System.out.println("微信支付订单号=" + transaction_id);
System.out.println("商户订单号=" + out_trade_no);
System.out.println("支付完成时间=" + time_end);
/**
* 可以在这里判断微信返回的参数,并进行业务的处理(如做订单的状态修改等)
*/
System.out.println("可以在这里判断微信返回的参数,并进行业务的处理(如做订单的状态修改等)");
OrderMaster orderMaster=orderMasterMapper.selectById(orderId);
orderMaster.setOrderStatus(1);
int num=orderMasterMapper.updateById(orderMaster);
/*//System.out.println(oid);
//开始根据oid找到对应的对象的值
OrderMaster orderMaster=orderMasterMapper.selectById(oid);
//通过调用set构造方法来把对象的orderstate来进行修改
orderMaster.setOrderStatus(1);
//调用修改的方法,把对应的值
int num=orderMasterMapper.updateById(orderMaster);*/
/**
*告诉微信我知道了,不要再给我发消息了,否则微信会8连击的反馈支付信息
*可以直接拼接成Xml形式的字符串,详情参考微信支付开发文档
*/
HashMap<String, String> result = new HashMap<String, String>();
result.put("return_code", "SUCCESS");
result.put("return_msg", "OK");
String xml = PaymentKit.toXml(result);
return xml;
}