小黑式烂代码之微信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实现)的主要内容,如果未能解决你的问题,请参考以下文章