1. 程式人生 > >小黑式爛代碼之微信APP支付 + 退款(JAVA實現)

小黑式爛代碼之微信APP支付 + 退款(JAVA實現)

result 技術分享 文件 index tsig eat java ava fan

首先,你得先有微信開發平臺賬號密碼還需要開通應用,然後還有微信服務商平臺商戶版賬號(這些我都是給產品經理拿的)

其次我認為你先去看一看微信開發平臺的文檔! 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實現)