pom依赖:

        <dependency><groupId>com.github.binarywang</groupId><artifactId>weixin-java-pay</artifactId><version>3.6.0</version><exclusions><exclusion><groupId>com.github.binarywang</groupId><artifactId>qrcode-utils</artifactId></exclusion></exclusions></dependency>

application.yml配置:

wx:app-id: app-secret: mch-id: mch-key: notify-url: refund-notify-url:  # 微信退款通知回调接口key-path: classpath:cert/apiclient_cert.p12

读取配置信息,初始化配置,两个文件:

@Configuration
@ConfigurationProperties(prefix = "wx")
@Data
public class WxProperties {private String appId;private String mchId;private String mchKey;private String notifyUrl;private String keyPath;private String refundNotifyUrl;}
@Configuration
public class WxConfig {private final WxProperties properties;public WxConfig(WxProperties properties) {this.properties = properties;}@Beanpublic WxPayConfig wxPayConfig() {WxPayConfig payConfig = new WxPayConfig();payConfig.setAppId(properties.getAppId());payConfig.setMchId(properties.getMchId());payConfig.setMchKey(properties.getMchKey());payConfig.setNotifyUrl(properties.getNotifyUrl());payConfig.setKeyPath(properties.getKeyPath());payConfig.setTradeType("APP");payConfig.setSignType("MD5");return payConfig;}@Beanpublic WxPayService wxPayService(WxPayConfig payConfig) {WxPayService wxPayService = new WxPayServiceImpl();wxPayService.setConfig(payConfig);return wxPayService;}
}

微信支付/退款/查询:

/*** 预支付* @param request* @return*/public WxPayAppOrderResult wxPrepay(PayRequest request) {// TODO 先保存支付请求历史记录WxPayAppOrderResult result = null;WxPayUnifiedOrderRequest orderRequest = new WxPayUnifiedOrderRequest();orderRequest.setOutTradeNo(request.getPaySn());orderRequest.setTotalFee((request.getTotalFee());orderRequest.setBody(request.getBody());orderRequest.setSpbillCreateIp(request.getIp());orderRequest.setDeviceInfo(request.getDeviceInfo()); // 非必填orderRequest.setDetail(request.getDetail()); // 非必填orderRequest.setAttach(request.getAttach()); // 非必填try {result = wxPayService.createOrder(orderRequest);} catch (WxPayException e) {log.error("微信支付-生成预付款订单错误", e);}return result;}/*** 支付通知* @param xmlResult* @return*/public String wxPayNotify(@RequestBody String xmlResult) {WxPayOrderNotifyResult result;try {result = wxPayService.parseOrderNotifyResult(xmlResult);if (!WxPayConstants.ResultCode.SUCCESS.equals(result.getReturnCode())) {log.error(xmlResult);throw new WxPayException("微信支付-通知失败!");}if (!WxPayConstants.ResultCode.SUCCESS.equals(result.getResultCode())) {log.error(xmlResult);throw new WxPayException("微信支付-通知失败!");}} catch (WxPayException e) {log.error("微信支付-通知失败", e);return WxPayNotifyResponse.fail(e.getMessage());}String orderSn = result.getOutTradeNo();String thirdTradeId = result.getTransactionId();// 支付成功业务处理return WxPayNotifyResponse.success("OK");}/*** 支付订单查询* @param transactionId 微信返回订单号* @param paySn         支付流水号* @return*/public String wxOrderQuery(String transactionId, String paySn) {WxPayOrderQueryResult result = null;try {result = wxPayService.queryOrder(transactionId, paySn);if (!WxPayConstants.ResultCode.SUCCESS.equals(result.getReturnCode())) {throw new WxPayException("微信支付-查询失败!");}if (!WxPayConstants.ResultCode.SUCCESS.equals(result.getResultCode())) {throw new WxPayException("微信支付-查询失败!");}} catch (WxPayException e) {log.error("微信支付-查询失败,params:" + result, e);return null;}if (!WxPayConstants.WxpayTradeStatus.SUCCESS.equals(result.getTradeState())) {// 查询失败}// 查询成功业务处理}/*** 微信退款* @param body* @return*/public String wxRefund(RefundRequest body) {WxPayRefundRequest refundRequest = new WxPayRefundRequest();refundRequest.setOutTradeNo(body.getPaySerial());refundRequest.setOutRefundNo(body.getPaySerial());refundRequest.setTotalFee(refundFee);refundRequest.setRefundFee(refundFee);refundRequest.setRefundDesc("商品退款");refundRequest.setNotifyUrl(wxProperties.getRefundNotifyUrl());try {WxPayRefundResult result = wxPayService.refund(refundRequest);if (REFUND_SUCCESS.equals(result.getReturnCode()) && REFUND_SUCCESS.equals(result.getResultCode())) {// 退款成功} else {// 退款失败}} catch (WxPayException e) {e.printStackTrace();}}/*** 微信退款通知* @return*/public String wxRefundNotify(@RequestBody String xmlResult) {WxPayRefundNotifyResult result;try {result = wxPayService.parseRefundNotifyResult(xmlResult);if (!WxPayConstants.ResultCode.SUCCESS.equals(result.getReturnCode())) {log.error(xmlResult);throw new WxPayException("微信退款-通知失败!");}if (!WxPayConstants.RefundStatus.SUCCESS.equals(result.getReqInfo().getRefundStatus())) {log.error(xmlResult);throw new WxPayException("微信退款-通知失败");}} catch (WxPayException e) {log.error("微信退款-通知失败", e);return WxPayNotifyResponse.fail(e.getMessage());}WxPayRefundNotifyResult.ReqInfo reqInfo = result.getReqInfo();reqInfo.getOutTradeNo();// 退款成功业务处理return WxPayNotifyResponse.success("OK");}

weixin-java-pay实现APP微信支付与退款相关推荐

  1. java+uniapp对接app微信支付

    java+uniapp对接app微信支付 1.准备工作 注册app APP接入微信支付,需要先将商户APP在微信开放平台进行注册,登记APP开发参数以生成APPID.具体操作步骤如下: 一.登录微信开 ...

  2. app微信支付-java服务端接口 支付/查询/退款

    app微信支付-java服务端接口 支付-查询-退款 个人看微信的文档,看了很多前辈的写法,终于调通了,在这里做一下记录. 首先来定义各种处理类(微信支付不需要特殊jar包,很多处理需要自己封装,当然 ...

  3. 微信回调 java_详解APP微信支付(java后台_统一下单和回调)

    1.微信配置信息 global.properties 2.方法wxpay用于生成预支付订单信息 方法notifyWeiXinPay用于微信支付成功后的回调, 注意: 在手机端使用微信支付成功后,微信服 ...

  4. php android 微信支付,Android_Android实现微信支付功能,开发Android APP微信支付功能, - phpStudy...

    Android实现微信支付功能 开发Android APP微信支付功能,需要完成三个步骤:第一步生成预支付订单.第二步生成微信支付参数.第三步调起微信APP支付.除了需要审核通过的APP应用外,还需要 ...

  5. app微信支付后端接口编写

    刚做完app微信支付,我这块主要负责的是后端,现在我将我怎么开发的以及踩过的坑给大家写出来 微信支付主要有3步, 第一步:是生成一个预付订单 第二步:第二次签名的信息传到app端 第三步:最后接受到微 ...

  6. 用java实现微信支付,退款,部分退款服务端

    由于公司业务需要,最近搞微信退款功能,今天抽空在此记录一下,以后用到也可以到这来看一眼.废话不多说,进入正题. 微信支付以及付款呢,先要有个证书,不清楚的,还要有证书,可以去微信平台看证书怎么下载 h ...

  7. Android支付宝错误码62009,hb混合开发app 微信支付提示支付宝62009未知错误

    问题描述 hb混合开发app 微信支付提示支付宝62009未知错误 问题出现的环境背景及自己尝试过哪些方法 真机模拟测试 相关代码 获取通道 mounted(){ plus.payment.getCh ...

  8. 微信h5支付 php sdk_微信支付V3版,H5,APP微信支付PHP服务端使用方式

    使用步骤: 1.导入下载好的微信V3版本SDK public function __construct() { parent::__construct(); //引入微信支付 Vendor('Wxpa ...

  9. IOS --app微信支付

    2019独角兽企业重金招聘Python工程师标准>>> 微信支付分为好几种,这里记录的是app微信支付流程. 适用场景 用户使用xxAPP时,需要通过微信支付完成某项报名.此时xxA ...

最新文章

  1. 小程序给视频加默认图片封面,点击播放视频并停止播放上一个视频
  2. 关于CSS中表单的一些属性和使用
  3. div 隐藏_注入WordPress网站的隐藏垃圾邮件链接
  4. 《侠侣天下》资料片武魂大揭晓
  5. 快学Scala习题解答—第十章 特质
  6. HTML5 基础知识(四)
  7. js String方法集合
  8. Web API 实现JSONP或者安装配置Cors跨域
  9. 循环基础-第一个while循环
  10. python scrapy request_Scrapy中的Request和日志分析|python基础教程|python入门|python教程...
  11. MySQL数据库的datetime与timestamp
  12. 光耦驱动单向可控硅_华越国际一文带路:可控硅触发设计技巧
  13. CodeProject每日精选: Progress controls 进度条
  14. exit(0)和exit(1)解释
  15. 斯坦福大学stanford
  16. 霍兰德SE型人格如何选择专业?高考志愿填报选专业
  17. PHP实现生成二维码的示例代码
  18. 生物电(ECG、EMG、EEG)科普研究
  19. 【无标题】阿里滑块 通过 x82y接口、dll、源码 返回x5sec,可解决!
  20. 华为业务:组织架构和产品矩阵

热门文章

  1. 牛客 Celestial Resort 质因数分解求最小公倍数 除法取模
  2. 微信特殊字符包括颜文字、表情的后台存储及前端展示方法
  3. python画地图经纬度_如何用python画地图上的标注线?
  4. MATLAB冒号用法
  5. 2.VIM文本编辑器的下载与使用
  6. uni-app做app自定义弹窗实现
  7. (升级版)基本粒子结构以及宇宙现象的徦说
  8. Vue Mixin 与小程序 Mixins 应用
  9. 阿里云对运营10多年来持续最久的故障发布复盘说明
  10. c#和java部署pytorch同事识别两个图片_身份证OCR识别移动端amp;服务器