官网文档:https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=9_4
一、下载证书
使用公众号支付申请退款需要验证商户API证书,登录微信商户平台(pay.weixin.qq.com)-->账户中心-->账户设置-->API安全,下载证书。apiclient_cert.p12是商户证书文件,除PHP外的开发均使用此证书文件。
二、使用证书
将证书放置在服务能访问的目录,但是注意以下几点:
1.证书文件不能放在web服务器虚拟目录,应放在有访问权限控制的目录中,防止被他人下载;
2.建议将证书文件名改为复杂且不容易猜测的文件名;
3.商户服务器要做好病毒和木马防护工作,不被非法侵入者窃取证书文件。
三、主要调用的api
微信退款:com.lly835.bestpay.service.impl.BestPayServiceImpl.refund(RefundRequest request)
四、代码编写
1、添加配置文件
由于是本地开发,我将证书重命名为h5.p12,放置在D:\\h5.p12路径,在application.yml文件中添加配置wechat.keyPath: D:\\h5.p12,然后将配置写入 WechatAccountConfig 对象
@Data
@Component
@ConfigurationProperties(prefix = "wechat")
public class WechatAccountConfig {
private String mpAppId;
private String mpAppSecret;
/**
* 商户id
*/
private String mchId;
/**
* 商户秘钥
*/
private String mchKey;
/**
* 商户证书路径
*/
private String keyPath;
/**
* 微信支付异步通知地址
*/
private String notifyUrl;
}
2、构造com.lly835.bestpay.service.impl.BestPayServiceImpl实例对象,并交由spring管理
@Component
public class WechatPayConfig {
@Autowired
private WechatAccountConfig wechatAccountConfig;
@Bean
public BestPayServiceImpl bestPayService () {
BestPayServiceImpl bestPayService = new BestPayServiceImpl();
bestPayService.setWxPayH5Config(wxPayH5Config());
return bestPayService;
}
@Bean
public WxPayH5Config wxPayH5Config() {
WxPayH5Config wxPayH5Config = new WxPayH5Config();
wxPayH5Config.setAppId(wechatAccountConfig.getMpAppId());
wxPayH5Config.setAppSecret(wechatAccountConfig.getMpAppSecret());
wxPayH5Config.setMchId(wechatAccountConfig.getMchId());
wxPayH5Config.setMchKey(wechatAccountConfig.getMchKey());
wxPayH5Config.setKeyPath(wechatAccountConfig.getKeyPath());
wxPayH5Config.setNotifyUrl(wechatAccountConfig.getNotifyUrl());
return wxPayH5Config;
}
}
3、controller
@Controller
@RequestMapping("/pay")
public class PayController {
@Autowired
private PayService payService;
/**
* 微信退款(需要下载证书,放置在D:\\h5.p12,然后配置地址wechat.keyPath: D:\\h5.p12)
* @param orderDTO
*/
@PostMapping
public void refund(OrderDTO orderDTO) {
payService.refund(orderDTO);
}
}
4、service实现类
@Service
@Slf4j
public class PayServiceImpl implements PayService {
@Autowired
private BestPayServiceImpl bestPayService;
@Override
public RefundResponse refund(OrderDTO orderDTO) {
RefundRequest refundRequest = new RefundRequest();
refundRequest.setOrderId(orderDTO.getOrderId());
refundRequest.setOrderAmount(orderDTO.getOrderAmount().doubleValue());
refundRequest.setPayTypeEnum(BestPayTypeEnum.WXPAY_H5);
log.info("【微信退款】refundRequest={}", JsonUtils.toJson(refundRequest));
RefundResponse refundResponse = bestPayService.refund(refundRequest);
log.info("【微信退款】refundResponse={}", JsonUtils.toJson(refundResponse));
return refundResponse;
}
}