和支付相关的类
PayHelper
package com.leyou.order.utils; import com.github.wxpay.sdk.WXPay; import com.leyou.order.config.PayConfig; import com.leyou.order.service.OrderService; import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.redis.core.StringRedisTemplate; import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.Map; import java.util.concurrent.TimeUnit; /** * @author: 98050 * @create: 2018-10-27 15:54 **/ @Component public class PayHelper { private WXPay wxPay; private static final Logger logger = LoggerFactory.getLogger(PayHelper.class); @Autowired private StringRedisTemplate redisTemplate; @Autowired private OrderService orderService; public PayHelper(PayConfig payConfig) { // 真实开发时 wxPay = new WXPay(payConfig); // 测试时 // wxPay = new WXPay(payConfig, WXPayConstants.SignType.MD5, true); } public String createPayUrl(Long orderId) { String key = "leyou.pay.url." + orderId; try { String url = this.redisTemplate.opsForValue().get(key); if (StringUtils.isNotBlank(url)) { return url; } } catch (Exception e) { logger.error("查询缓存付款链接异常,订单编号:{}", orderId, e); } try { Map<String, String> data = new HashMap<>(); // 商品描述 data.put("body", "乐优商城测试"); // 订单号 data.put("out_trade_no", orderId.toString()); //货币 data.put("fee_type", "CNY"); //金额,单位是分 data.put("total_fee", "1"); //调用微信支付的终端IP(estore商城的IP) data.put("spbill_create_ip", "127.0.0.1"); //回调地址 data.put("notify_url", "http://test.leyou.com/wxpay/notify"); // 交易类型为扫码支付 data.put("trade_type", "NATIVE"); //商品id,使用假数据 data.put("product_id", "1234567"); Map<String, String> result = this.wxPay.unifiedOrder(data); if ("SUCCESS".equals(result.get("return_code"))) { String url = result.get("code_url"); // 将付款地址缓存,时间为10分钟 try { this.redisTemplate.opsForValue().set(key, url, 10, TimeUnit.MINUTES); } catch (Exception e) { logger.error("缓存付款链接异常,订单编号:{}", orderId, e); } return url; } else { logger.error("创建预交易订单失败,错误信息:{}", result.get("return_msg")); return null; } } catch (Exception e) { logger.error("创建预交易订单异常", e); return null; } } /** * 查询订单状态 * * @param orderId * @return */ public PayState queryOrder(Long orderId) { Map<String, String> data = new HashMap<>(); // 订单号 data.put("out_trade_no", orderId.toString()); try { Map<String, String> result = this.wxPay.orderQuery(data); if (result == null) { // 未查询到结果,认为是未付款 return PayState.NOT_PAY; } String state = result.get("trade_state"); if ("SUCCESS".equals(state)) { // success,则认为付款成功 // 修改订单状态 this.orderService.updateOrderStatus(orderId, 2); return PayState.SUCCESS; } else if (StringUtils.equals("USERPAYING", state) || StringUtils.equals("NOTPAY", state)) { // 未付款或正在付款,都认为是未付款 return PayState.NOT_PAY; } else { // 其它状态认为是付款失败 return PayState.FAIL; } } catch (Exception e) { logger.error("查询订单状态异常", e); return PayState.NOT_PAY; } } }PayConfig
package com.leyou.order.config; import com.github.wxpay.sdk.WXPayConfig; import com.leyou.order.properties.PayProperties; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.context.annotation.Configuration; import java.io.InputStream; /** * @author: 98050 * @create: 2018-10-27 **/ @Configuration @EnableConfigurationProperties(PayProperties.class) public class PayConfig implements WXPayConfig { @Autowired private PayProperties payProperties; @Override public String getAppID() { return payProperties.getAppId(); } @Override public String getMchID() { return payProperties.getMchId(); } @Override public String getKey() { return payProperties.getKey(); } @Override public InputStream getCertStream() { return null; } @Override public int getHttpConnectTimeoutMs() { return payProperties.getConnectTimeoutMs(); } @Override public int getHttpReadTimeoutMs() { return payProperties.getReadTimeoutMs(); } }PayProperties
package com.leyou.order.properties; import org.springframework.boot.context.properties.ConfigurationProperties; /** * @author: 98050 * @create: 2018-10-27 11:38 **/ @ConfigurationProperties(prefix = "leyou.pay") public class PayProperties { /** * 公众账号ID */ private String appId; /** * 商户号 */ private String mchId; /** * 生成签名的密钥 */ private String key; /** * 连接超时时间 */ private int connectTimeoutMs; /** * 读取超时时间 */ private int readTimeoutMs; public String getAppId() { return appId; } public void setAppId(String appId) { this.appId = appId; } public String getMchId() { return mchId; } public void setMchId(String mchId) { this.mchId = mchId; } public String getKey() { return key; } public void setKey(String key) { this.key = key; } public int getConnectTimeoutMs() { return connectTimeoutMs; } public void setConnectTimeoutMs(int connectTimeoutMs) { this.connectTimeoutMs = connectTimeoutMs; } public int getReadTimeoutMs() { return readTimeoutMs; } public void setReadTimeoutMs(int readTimeoutMs) { this.readTimeoutMs = readTimeoutMs; } }PayState
package com.leyou.order.utils; /** * @author: HuYi.Zhang * @create: 2018-06-07 17:44 **/ public enum PayState { /** * 未支付0 * 支付成功1 * 支付失败2 */ NOT_PAY(0),SUCCESS(1),FAIL(2); PayState(int value) { this.value = value; } int value; public int getValue() { return value; } }