1.本地生成购币订单
/**
* 1.生成购币订单
*/
String orderNumber = BaseSettings.getOrderNumber();
PersonOrderEntity personOrderEntity = new PersonOrderEntity();
personOrderEntity.setOrdernumber(orderNumber);
personOrderEntity.setPersonidcard(idcard);
personOrderEntity.setMoney(new BigDecimal(money));
personOrderEntity.setAmount(Integer.valueOf(amount));
personOrderEntity.setLastamount(Integer.valueOf(amount));
personOrderEntity.setOrderstatus(0);
personOrderEntity.setPaytype(2);
personOrderEntity.setCreatetime(new Date());
personOrderEntity.setPersonname(person.getName());
personOrderEntity.setPersontel(person.getTel());
int insertSelective = baseEntityMapper.insertSelective(personOrderEntity);
if (insertSelective == 0) {
logger.info("微信支付(插入订单为null) :"+BaseSettings.Validate.生成微信支付订单失败.getMsg()+", idcard:"+idcard+", money:"+money+", amount:"+amount);
return r.setStatus(R.STATUS_ERROR)
.setStatusMsg(BaseSettings.Validate.生成微信支付订单失败.getMsg())
.setStatusCode(BaseSettings.Validate.生成微信支付订单失败.getCode());
}
2.调用微信接口
//对以下字段进行签名
SortedMap<String, String> packageParams = new TreeMap();
packageParams.put("appid", WechatConfig.appid);
packageParams.put("attach", attach);
packageParams.put("body", body);
packageParams.put("mch_id", mch_id);
packageParams.put("nonce_str", nonce_str);
packageParams.put("notify_url", notify_url);
packageParams.put("out_trade_no", out_trade_no);
packageParams.put("spbill_create_ip", spbill_create_ip);
packageParams.put("total_fee", total_fee);
packageParams.put("trade_type", trade_type);
RequestHandler reqHandler = new RequestHandler(request, response);
reqHandler.init(WechatConfig.appid, WechatConfig.appsecret, WechatConfig.partnerkey);
String sign = reqHandler.createSign(packageParams);//获取签名
String xml = "<xml>" +
"<appid>" + WechatConfig.appid + "</appid>" +
"<attach>" + attach + "</attach>" +
"<body><![CDATA[" + body + "]]></body>" +
"<mch_id>" + mch_id + "</mch_id>" +
"<nonce_str>" + nonce_str + "</nonce_str>" +
"<notify_url>" + notify_url + "</notify_url>" +
"<out_trade_no>" + out_trade_no + "</out_trade_no>" +
"<spbill_create_ip>" + spbill_create_ip + "</spbill_create_ip>" +
"<total_fee>" + total_fee + "</total_fee>" +
"<trade_type>" + trade_type + "</trade_type>" +
"<sign>" + sign + "</sign>" +
"</xml>";
String allParameters = reqHandler.genPackage(packageParams);
String createOrderURL = WechatConfig.createOrderURL;
String prepay_id = new GetWxOrderno().getPayNo(createOrderURL, xml);
if (StringUtils.isEmpty(prepay_id)) {
//事务回滚
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
logger.info("微信支付(微信返回prepay_id为null) :"+BaseSettings.Validate.生成微信支付订单失败.getMsg()+", idcard:"+idcard+", money:"+money+", amount:"+amount);
return r.setStatus(R.STATUS_ERROR)
.setStatusMsg(BaseSettings.Validate.调用微信接口返回prepay_id.getMsg())
.setStatusCode(BaseSettings.Validate.调用微信接口返回prepay_id.getCode());
}
//获取到prepayid后对以下字段进行签名最终发送给app
SortedMap<String, String> finalpackage = new TreeMap<String, String>();
String timestamp = Sha1Util.getTimeStamp();
finalpackage.put("appid", WechatConfig.appid);
finalpackage.put("timestamp", timestamp);
finalpackage.put("noncestr", nonce_str);
finalpackage.put("partnerid", WechatConfig.partner);
finalpackage.put("package", "Sign=WXPay");
finalpackage.put("prepayid", prepay_id);
String finalsign = reqHandler.createSign(finalpackage);
Map<String, Object> maps = new HashMap();
maps.put("msg", WechatConfig.wx_msg);
maps.put("appid", WechatConfig.appid);
maps.put("timestamp", timestamp);
maps.put("noncestr", nonce_str);
maps.put("partnerid", WechatConfig.partner);
maps.put("prepayid", prepay_id);
maps.put("package", WechatConfig.wx_package);
maps.put("sign", finalsign);
logger.info("微信支付 :"+BaseSettings.Validate.生成微信支付订单失败.getMsg()+", idcard:"+idcard+", money:"+money+", amount:"+amount);
return r.setData(maps).setStatus(R.STATUS_SUCCESS)
.setStatusMsg(BaseSettings.Validate.生成微信支付订单成功.getMsg())
.setStatusCode(BaseSettings.Validate.生成微信支付订单成功.getCode());
3.异步通知
public String saveWechatNotice(HttpServletRequest request, HttpServletResponse response) throws Exception {
response.setHeader("Access-Control-Allow-Origin", "*");
InputStream in = request.getInputStream();
ByteArrayOutputStream out = new ByteArrayOutputStream();
byte[] buffer = new byte[1024];
int len = 0;
while ((len = in.read(buffer)) != -1) {
out.write(buffer, 0, len);
}
out.close();
in.close();
String msgxml = new String(out.toByteArray(), "utf-8");//xml数据
Map map = new GetWxOrderno().doXMLParse(msgxml);
String result_code = (String) map.get("result_code");
String out_trade_no = (String) map.get("out_trade_no");
String total_fee = (String) map.get("total_fee");
String sign = (String) map.get("sign");
Double amount = new Double(total_fee) / 100; //获取订单金额
String attach = (String) map.get("attach");
String sn = out_trade_no.split("\\|")[0]; //获取订单编号
if (result_code.equals("SUCCESS")) {
//总金额以分为单位,不带小数点
String fee_type = (String) map.get("fee_type");
String bank_type = (String) map.get("bank_type");
String cash_fee = (String) map.get("cash_fee");
String is_subscribe = (String) map.get("is_subscribe");
String nonce_str = (String) map.get("nonce_str");
String openid = (String) map.get("openid");
String return_code = (String) map.get("return_code");
String sub_mch_id = (String) map.get("sub_mch_id");
String time_end = (String) map.get("time_end");
String trade_type = (String) map.get("trade_type");
String transaction_id = (String) map.get("transaction_id");
//需要对以下字段进行签名
SortedMap<String, String> packageParams = new TreeMap();
packageParams.put("appid", WechatConfig.appid);
packageParams.put("attach", ""); //用自己系统的数据:会员id
packageParams.put("bank_type", bank_type);
packageParams.put("cash_fee", cash_fee);
packageParams.put("fee_type", fee_type);
packageParams.put("is_subscribe", is_subscribe);
packageParams.put("mch_id", WechatConfig.partner);
packageParams.put("nonce_str", nonce_str);
packageParams.put("openid", openid);
packageParams.put("out_trade_no", out_trade_no);
packageParams.put("result_code", result_code);
packageParams.put("return_code", return_code);
packageParams.put("sub_mch_id", sub_mch_id);
packageParams.put("time_end", time_end);
packageParams.put("total_fee", total_fee); //用自己系统的数据:订单金额
packageParams.put("trade_type", trade_type);
packageParams.put("transaction_id", transaction_id);
RequestHandler reqHandler = new RequestHandler(request, response);
reqHandler.init(WechatConfig.appid, WechatConfig.appsecret, WechatConfig.partnerkey);
String endsign = reqHandler.createSign(packageParams);
if (sign.equals(endsign)) {//验证签名是否正确 官方签名工具地址:https://pay.weixin.qq.com/wiki/tools/signverify/
//支付成功
String orderNumber = out_trade_no;
//查询订单号的真实性 @add alex 2017-09-27
Map<String, Object> condition = new HashMap();
condition.put("orderNumber", orderNumber);
PersonOrderEntity personOrders = baseEntityMapper.selectOrderIdByMessage(condition);
if (personOrders == null || personOrders.getOrderstatus() == 1) {
return setXml("FALSE", "OK");
}
// AMQMSG amqmsg = new AMQMSG();
PersonOrderEntity personOrderEntity = new PersonOrderEntity();
personOrderEntity.setOrdernumber(orderNumber);
personOrderEntity.setOrderstatus(1);
personOrderEntity.setCompletetime(new Date());
// amqmsg.setOperate(AMQConfig.AMQ_OPT_UPDATE);
// amqmsg.setTablename(AMQConfig.AMQ_TABLE_PERSONORDER);
// amqmsg.setData(personOrderEntity);
// queueProducer.sendMessage(amqmsg.toString());
int update = baseEntityMapper.updateByOrdernumber(personOrderEntity);
if (update == 0) {
return setXml("FALSE", "OK");
}
//redis
String idcard = personOrders.getPersonidcard();
// Integer lastAmount = (Integer) redisTemplate.opsForValue().get(BaseSettings.REDIS_PERSON_AMOUNT_PREX + idcard);
Integer lastAmount =redisDao.getLastAmount(idcard);
if (lastAmount == null) {
lastAmount = 0;
}
// redisTemplate.opsForValue().set(BaseSettings.REDIS_PERSON_AMOUNT_PREX + idcard, lastAmount + personOrders.getLastamount());
redisDao.setLastAmount(idcard,lastAmount + personOrders.getLastamount());
}
}
return setXml("SUCCESS", "OK");
}