小黑式烂代码之微信APP支付 + 退款(JAVA实现)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了小黑式烂代码之微信APP支付 + 退款(JAVA实现)相关的知识,希望对你有一定的参考价值。

首先,你得先有微信开发平台账号密码还需要开通应用,然后还有微信服务商平台商户版账号(这些我都是给产品经理拿的)

其次我认为你先去看一看微信开发平台的文档!  https://pay.weixin.qq.com/wiki/doc/api/index.html

技术分享图片

 

 这里有很多种支付,我就采用APP支付来说了(会了APP支付其实H5支付都差不多的!)

 

技术分享图片

 

进来后是这样的,随便看看‘APP支付那几篇文章‘讲的流程!,看完后知道大概了就可以看看‘API列表了‘

 

技术分享图片

 

 

我们后台开发需要关注的就是这三个API了!

 

 

技术分享图片

 

 

  1 /**
  2  * @description:微信支付: APP支付
  3  * @author:FanHaoJian
  4  */
  5 @Service
  6 public class WechatPayService {
  7     private static final Logger LOGGER = LoggerFactory.getLogger(WechatPayService.class);
  8     
  9     /************ 微信开放平台配置  ***************/
 10     
 11     /** APPID */
 12     private static final String APPID = ""; 
 13     
 14     /** 商户号 */
 15     private static final String MCH_ID = "";  
 16     
 17     /** 密钥 */
 18     private static final String PRIVATE_KEY = "";
 19     
 20     /** 用户订单支付结果异步通知url */
 21     private static final String NOTIFY_URL = "";
 22     
 23     /** 商户支付证书路径 */
 24     private static final String API_CLIENT_CERT_PATH = "";
 25     
 26     // 加载商户支付证书文件;
 27     static {
 28         LocalHttpClient.initMchKeyStore(MCH_ID, API_CLIENT_CERT_PATH);
 29     }
 30     
 31     /**
 32      * @description:使用微信支付-APP支付方式-统一下单;
 33      * @return 支付参数,如果支付失败则返回null
 34      * @author:Fanhaojian
 35      */
 36     public MchPayApp orderAppPay(PayLog payLog) {
 37         
 38         Unifiedorder unifiedorder = new Unifiedorder();
 39         
 40         /** APPID */
 41         unifiedorder.setAppid(APPID);
 42         
 43         /** 商户号 */
 44         unifiedorder.setMch_id(MCH_ID);
 45         
 46         /** 随机字符串 */
 47         unifiedorder.setNonce_str(UUID.randomUUID().toString().replaceAll("-", ""));
 48         
 49         /** 商品描述 */
 50         unifiedorder.setBody(payLog.getPayCode());
 51         
 52         /** 商户订单号 */
 53         unifiedorder.setOut_trade_no(payLog.getPayCode());
 54         
 55         /** 订单总金额 */
 56         unifiedorder.setTotal_fee(payLog.getPayPrice().multiply(new BigDecimal(100)).intValue() + "");   // 订单总金额,单位为分;
 57         
 58         /** 用户端请求IP地址 */
 59         unifiedorder.setSpbill_create_ip(IpUtils.getClientIp());
 60         
 61         /** 异步通知回调地址 */
 62         unifiedorder.setNotify_url(NOTIFY_URL);
 63         
 64         /** 交易类型 */
 65         unifiedorder.setTrade_type("APP");
 66         
 67         LOGGER.warn("微信APP支付--(签名前):" + XMLConverUtil.convertToXML(unifiedorder));
 68         
 69         /** 获取签名 */
 70         UnifiedorderResult unifiedorderResult = PayMchAPI.payUnifiedorder(unifiedorder, PRIVATE_KEY);
 71         
 72         LOGGER.warn("微信APP支付--支付统一下单接口请求状态(return_code):" + unifiedorderResult.getReturn_code());
 73         LOGGER.warn("微信APP支付--支付统一下单接口请求状态(return_msg):" + unifiedorderResult.getReturn_msg());
 74         LOGGER.warn("微信APP支付--支付统一下单接口请求状态(result_code):" + unifiedorderResult.getResult_code());
 75         LOGGER.warn("微信APP支付--支付请求参数封装(签名后):" + XMLConverUtil.convertToXML(unifiedorder));
 76         LOGGER.warn("微信APP支付--支付统一下单接口返回数据:" + FastJSONUtils.getJsonHelper().toJSONString(unifiedorderResult));
 77         
 78         // 下单结果验签; 
 79         if(unifiedorderResult.getSign_status() != null && unifiedorderResult.getSign_status()) {
 80             LOGGER.warn("微信APP支付验签成功");
 81             return PayUtil.generateMchAppData(unifiedorderResult.getPrepay_id(), APPID, MCH_ID, PRIVATE_KEY);
 82         }
 83         return null;
 84     }
 85     
 86     /**
 87      * @description:微信退款业务封装(支付押金退还);
 88      * @param PayLog order:支付订单信息
 89      *           Double refundAmount:退款金额
 90      * @return 微信退款接口返回数据
 91      * @author:FanHaoJian
 92      */
 93     public Boolean refundOrder(PayLog order, Double refundAmount) {
 94         
 95         // 调用微信支付退款接口;
 96         SecapiPayRefund payRefund = new SecapiPayRefund();
 97         payRefund.setAppid(APPID);
 98         payRefund.setMch_id(MCH_ID);
 99         payRefund.setNonce_str(UUID.randomUUID().toString().replaceAll("-", ""));
100         payRefund.setOut_trade_no(order.getPayCode());//支付订单号
101         payRefund.setOut_refund_no(order.getRefundCode());//退款单号
102         payRefund.setTotal_fee(order.getPayPrice().multiply(new BigDecimal(100)).intValue());//原订单金额,单位:分;
103         payRefund.setRefund_fee(new BigDecimal(refundAmount).multiply(new BigDecimal(100)).intValue());//退款订单金额,单位:分;
104         
105         SecapiPayRefundResult refundResult = PayMchAPI.secapiPayRefund(payRefund, PRIVATE_KEY);
106         
107         // 微信支付退款接口返回数据验签;
108         if(refundResult.getSign_status() != null && refundResult.getSign_status()) {
109             LOGGER.warn("微信退款接口--接口请求状态(return_code):" + refundResult.getReturn_code());
110             LOGGER.warn("微信退款接口--接口请求状态(return_msg):" + refundResult.getReturn_msg());
111             
112             // 退款信息提交成功;
113             if("SUCCESS".equals(refundResult.getReturn_code())) {
114                 LOGGER.warn("微信退款接口--接口请求状态(result_code):" + refundResult.getResult_code());
115                 LOGGER.warn("微信退款接口--接口请求状态(err_code):" + refundResult.getErr_code());
116                 LOGGER.warn("微信退款接口--接口请求状态(err_code_des):" + refundResult.getErr_code_des());
117                 
118                 return Boolean.TRUE;
119             }
120         }
121         
122         return Boolean.FALSE;
123     }
124 }

 

以上是关于小黑式烂代码之微信APP支付 + 退款(JAVA实现)的主要内容,如果未能解决你的问题,请参考以下文章

微信支付宝各种支付退款

Java+微信支付(下预购单+回调+退款+查询账单)

支付开发填坑记之微信支付

uniapp支付之微信支付

微信支付退款

微信App支付(JAVA端)