网站微信扫码支付java开发
一、网站微信扫码支付开发并没有现成的java示例,总结一下自己微信扫码支付心得
二、首先去微信公众平台申请账户
https://mp.weixin.qq.com
**
三、账户开通、开发者认证之后就可以进行微信支付开发了
1、微信统一下单接口调用获取预支付id,以及生成二维码所需的codeUrl
/**
* 保存订单,并生成二维码所需的codeUrl
*
* @param request
* @param response
* @param notifyURLBuf
* @param order
* @return
* @throws Exception
*/
@Override
public Map<String, String> getWechatOrderInfo(String ip, Cuser user, String notifyUrl, Order order) throws Exception {
Map<String, String> resultMap = new HashMap<String, String>();
// 生成并保存订单
order.setUserId(user.getId());
// 支付方式 0:银联 1:支付宝 2:网上银行 3:微信 4:其他
order.setPayType("3");
// 生成订单号
order.setOrderNo(OrderNoGenerator.getOrderNo());
// 订单类型 1:消费 2:退款
order.setOrderType("1");
// 订单创建时间
order.setCreateTime(new Date());
// 订单更新时间
order.setUpdateTime(new Date());
// 订单状态 0: 交易中 1:完成 2:已取消
order.setOrderStatus("0");
// 付款状态 0:失败 1:成功 2、待付款
order.setPayStatus("2");
// 设置订单失效时间
Calendar calendar = Calendar.getInstance();
calendar.add(Calendar.HOUR, 2);
order.setExpireTime(calendar.getTime());
Integer orderId = this.balanceDao.saveOrder(order);
Map<String, String> payPreIdMap = new HashMap<>();
payPreIdMap = WechatUtil.getPayPreId(String.valueOf(orderId), "体检报告", notifyUrl, ip,
String.valueOf((order.getMoney().multiply(new BigDecimal(100)).intValue())), orderId.toString());
String prePayId = payPreIdMap.get("prepay_id");
// 更新
order.setId(orderId);
order.setPrepayId(prePayId);
order.setCodeUrl(payPreIdMap.get("code_url"));
this.balanceDao.updateOrder(order);
// return WechatUtil.QRfromGoogle(order.getCodeUrl(), 300, 0);
resultMap.put("codeUrl", order.getCodeUrl());
resultMap.put("orderId", String.valueOf(order.getId()));
return resultMap;
}
此方法返回的数据如下
<xml><return_code><![CDATA[SUCCESS]]></return_code>
<return_msg><![CDATA[OK]]></return_msg>
<appid><![CDATA[wxaf0b*****8afbf]]></appid>
<mch_id><![CDATA[1408****02]]></mch_id>
<nonce_str><![CDATA[zf0vGvdtVycBliwB]]></nonce_str>
<sign><![CDATA[A2910F16086211153D747058063B3368]]></sign>
<result_code><![CDATA[SUCCESS]]></result_code>
<prepay_id><![CDATA[wx201701191109388037e9a12310276591827]]></prepay_id>
<trade_type><![CDATA[NATIVE]]></trade_type>
<code_url><![CDATA[weixin://wxpay/bizpayurl?pr=1UjorNX]]></code_url>
</xml>
2、服务器端接受微信支付结果通知
/**
* 保存微信通知结果
*
* @param request
* @param response
* @return
* @throws Exception
*/
@Override
public String saveWechatNotify(String notifyInfoXml) throws Exception {
Map<String, String> noticeMap = XMLUtil.doXMLParse(notifyInfoXml);
// 这个其实是订单 的id
String outTradeNo = noticeMap.get("out_trade_no");
Order order = this.balanceDao.getOrderById(Integer.valueOf(outTradeNo));
// 如果支付通知信息不为,说明请求已经处理过,直接返回
if (StringUtil.isNotEmpty(order.getNotifyInfo())) {
return "SUCCESS";
}
String sign = noticeMap.get("sign");
noticeMap.remove("sign");
// 验签通过
if (WechatUtil.getSignVeryfy(noticeMap, sign)) {
// 通信成功此字段是通信标识,非交易标识,交易是否成功需要查看result_code来判断
if ("SUCCESS".equals(noticeMap.get("return_code"))) {
// 交易成功
if ("SUCCESS".equals(noticeMap.get("result_code"))) {
// 商户订单号
// 订单更新时间
order.setUpdateTime(new<