日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

SpringBoot 微信退款功能的示例代碼

瀏覽:153日期:2022-06-17 11:13:44

一:微信支付證書配置

SpringBoot 微信退款功能的示例代碼

二:證書讀取以及讀取后的使用

package com.zhx.guides.assistant.config.wechatpay; import org.apache.commons.io.IOUtils;import org.apache.http.HttpEntity;import org.apache.http.client.methods.CloseableHttpResponse;import org.apache.http.client.methods.HttpPost;import org.apache.http.conn.ssl.SSLConnectionSocketFactory;import org.apache.http.entity.StringEntity;import org.apache.http.impl.client.CloseableHttpClient;import org.apache.http.impl.client.HttpClients;import org.apache.http.ssl.SSLContexts;import org.apache.http.util.EntityUtils;import org.springframework.core.io.ClassPathResource; import javax.net.ssl.SSLContext;import java.io.ByteArrayInputStream;import java.io.IOException;import java.io.InputStream;import java.security.KeyStore; /** * @Class WeChatConfigUtil * @Version 1.0 * @Date 創建時間:2020-06-15 16:19 * @Copyright Copyright by * @Direction 類說明 */public class WeChatConfigUtil { private static byte[] certData; /**** * @throws Exception */ static { try { //從微信商戶平臺下載的安全證書存放的目錄 //String certPath = 'D:configapiclient_cert.p12'; //File file = new File(certPath); //InputStream certStream = new FileInputStream(file); //使用springboot配置文件內讀取的方式 ClassPathResource classPathResource = new ClassPathResource('user_keyapiclient_cert.p12'); InputStream certStream = classPathResource.getInputStream(); WeChatConfigUtil.certData = IOUtils.toByteArray(certStream); certStream.read(WeChatConfigUtil.certData); certStream.close(); } catch (IOException e) { e.printStackTrace(); } } /** * 開始退款操作 * * @param mchId 商戶ID * @param url 請求URL * @param data 退款參數 * @return * @throws Exception */ public static String doRefund(String mchId, String url, String data) throws Exception { /** * 注意PKCS12證書 是從微信商戶平臺-》賬戶設置-》 API安全 中下載的 */ KeyStore keyStore = KeyStore.getInstance('PKCS12'); //這里自行實現我是使用數據庫配置將證書上傳到了服務器可以使用 FileInputStream讀取本地文件 //ByteArrayInputStream inputStream = FileUtil.getInputStream('https://############################.p12'); ByteArrayInputStream inputStream = new ByteArrayInputStream(WeChatConfigUtil.certData); try { //這里寫密碼..默認是你的MCHID keyStore.load(inputStream, mchId.toCharArray()); } finally { inputStream.close(); } SSLContext sslcontext = SSLContexts.custom()//這里也是寫密碼的.loadKeyMaterial(keyStore, mchId.toCharArray()).build(); SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(sslcontext,SSLConnectionSocketFactory.getDefaultHostnameVerifier()); CloseableHttpClient httpclient = HttpClients.custom().setSSLSocketFactory(sslsf).build(); try { HttpPost httpost = new HttpPost(url); httpost.setEntity(new StringEntity(data, 'UTF-8')); CloseableHttpResponse response = httpclient.execute(httpost); try {HttpEntity entity = response.getEntity();//接受到返回信息String jsonStr = EntityUtils.toString(response.getEntity(), 'UTF-8');EntityUtils.consume(entity);return jsonStr; } finally {response.close(); } } finally { httpclient.close(); } } }

三:發起訂單退款操作

/** * 封裝查詢請求數據 * @param tradeRefund 退款訂單請求信息 * @param path數據訪問PATH * @return */private static SortedMap<String, Object> refundData( TradeRefund tradeRefund , String path ) throws Exception {//構建參數Map<String, String> dataMap = new HashMap<>();dataMap.put('appid','wx#################');dataMap.put('mch_id','137#############');//自行實現該隨機串dataMap.put('nonce_str',Core.MD5('12344'));dataMap.put('out_trade_no','P190808170038402889c5318502');dataMap.put('out_refund_no','P190808170038402889c5318502');dataMap.put('total_fee','1');dataMap.put('refund_fee','1');dataMap.put('refund_desc','退款');//生成簽名String sign = PayToolUtil.createSign('UTF-8', dataMap , WeichatPayConfigure.API_KEY );//WXPayUtil.generateSignature(dataMap, 'rv4###################');dataMap.put('sign', sign);//map數據轉xmlString requestXML = getRequestXml( dataMap );logger.info( '訂單退款請求參數:n' + requestXML );//發起退款String responseXml = WeChatConfigUtil.doRefund( WeichatPayConfigure.MCH_ID , 'https://api.mch.weixin.qq.com/secapi/pay/refund', requestXML );} /** * @author * @date 2016-4-22 * @Description:將請求參數轉換為xml格式的string * @param parameters * 請求參數 * @return */ public static String getRequestXml(SortedMap<Object, Object> parameters) { StringBuffer sb = new StringBuffer(); sb.append('<xml>'); Set es = parameters.entrySet(); Iterator it = es.iterator(); while (it.hasNext()) { Map.Entry entry = (Map.Entry) it.next(); String k = (String) entry.getKey(); String v = (String) entry.getValue(); if ('attach'.equalsIgnoreCase(k) || 'body'.equalsIgnoreCase(k) || 'sign'.equalsIgnoreCase(k)) { sb.append('<' + k + '>' + '<![CDATA[' + v + ']]></' + k + '>'); } else { sb.append('<' + k + '>' + v + '</' + k + '>'); } } sb.append('</xml>'); return sb.toString(); }

/** * @author * @date 2016-4-22 * @Description:sign簽名 * @param characterEncoding * 編碼格式 * @param packageParams * 請求參數 * @return */ public static String createSign(String characterEncoding, SortedMap<Object, Object> packageParams, String API_KEY) { StringBuffer sb = new StringBuffer(); Set es = packageParams.entrySet(); Iterator it = es.iterator(); while (it.hasNext()) { Map.Entry entry = (Map.Entry) it.next(); String k = (String) entry.getKey(); String v = (String) entry.getValue(); if (null != v && !''.equals(v) && !'sign'.equals(k) && !'key'.equals(k)) { sb.append(k + '=' + v + '&'); } } sb.append('key=' + API_KEY); String sign = MD5Util.MD5Encode(sb.toString(), characterEncoding).toUpperCase(); return sign; }

package com.zhx.guides.assistant.interfaces.pay.wechatpay.util; import java.security.MessageDigest; public class MD5Util { private static String byteArrayToHexString(byte b[]) { StringBuffer resultSb = new StringBuffer(); for (int i = 0; i < b.length; i++) resultSb.append(byteToHexString(b[i])); return resultSb.toString(); } private static String byteToHexString(byte b) { int n = b; if (n < 0) n += 256; int d1 = n / 16; int d2 = n % 16; return hexDigits[d1] + hexDigits[d2]; } public static String MD5Encode(String origin, String charsetname) { String resultString = null; try { resultString = new String(origin); MessageDigest md = MessageDigest.getInstance('MD5'); if (charsetname == null || ''.equals(charsetname)) resultString = byteArrayToHexString(md.digest(resultString .getBytes())); else resultString = byteArrayToHexString(md.digest(resultString .getBytes(charsetname))); } catch (Exception exception) { } return resultString; } /*** * 簡化版本 * @param s * @return */ public final static String MD5(String s) {char hexDigits[] = { ’0’, ’1’, ’2’, ’3’, ’4’, ’5’, ’6’, ’7’, ’8’, ’9’, ’A’, ’B’, ’C’, ’D’, ’E’, ’F’ };try {byte[] btInput = s.getBytes('utf-8');// 獲得MD5摘要算法的 MessageDigest 對象MessageDigest mdInst = MessageDigest.getInstance('MD5');// 使用指定的字節更新摘要mdInst.update(btInput);// 獲得密文byte[] md = mdInst.digest();// 把密文轉換成十六進制的字符串形式int j = md.length;char str[] = new char[j * 2];int k = 0;for (int i = 0; i < j; i++) {byte byte0 = md[i];str[k++] = hexDigits[byte0 >>> 4 & 0xf];str[k++] = hexDigits[byte0 & 0xf];}return new String(str);} catch (Exception e) {e.printStackTrace();return null;}} private static final String hexDigits[] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' }; }

/** * @author * @date 2016-4-22 * @Description:將請求參數轉換為xml格式的string * @param parameters * 請求參數 * @return */ public static String getRequestXml(SortedMap<Object, Object> parameters) { StringBuffer sb = new StringBuffer(); sb.append('<xml>'); Set es = parameters.entrySet(); Iterator it = es.iterator(); while (it.hasNext()) { Map.Entry entry = (Map.Entry) it.next(); String k = (String) entry.getKey(); String v = (String) entry.getValue(); if ('attach'.equalsIgnoreCase(k) || 'body'.equalsIgnoreCase(k) || 'sign'.equalsIgnoreCase(k)) { sb.append('<' + k + '>' + '<![CDATA[' + v + ']]></' + k + '>'); } else { sb.append('<' + k + '>' + v + '</' + k + '>'); } } sb.append('</xml>'); return sb.toString(); }

四:請求XML示例

<xml> <appid>wx2421b1c4370ec43b</appid> <mch_id>10000100</mch_id> <nonce_str>6cefdb308e1e2e8aabd48cf79e546a02</nonce_str> <out_refund_no>1415701182</out_refund_no> <out_trade_no>1415757673</out_trade_no> <refund_fee>1</refund_fee> <total_fee>1</total_fee> <transaction_id></transaction_id> <sign>FE56DD4AA85C0EECA82C35595A69E153</sign></xml>

五:官方信息

官方地址:https://pay.weixin.qq.com/wiki/doc/api/wxa/wxa_api.php?chapter=9_4

需注意這兩個參數我使用的是out_trade_no

SpringBoot 微信退款功能的示例代碼

總結

到此這篇關于SpringBoot 微信退款功能的示例代碼的文章就介紹到這了,更多相關SpringBoot 微信退款內容請搜索好吧啦網以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持好吧啦網!

標簽: 微信
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
欧美 日韩 国产一区二区在线视频| 麻豆久久精品| 99久久www免费| 日韩中文字幕一区二区三区| 久久久久久夜| 国产精品伊人| 麻豆国产精品| 香蕉久久一区| 精品欧美激情在线观看| 国产精品mm| 蜜臀av在线播放一区二区三区| 久久久久久网| 国产成人精品一区二区三区在线| 国产日韩一区二区三区在线| 在线亚洲自拍| 久久黄色影院| 久久精品国产99久久| 国产中文在线播放| 久久久一本精品| 日韩黄色av| 伊人精品久久| 视频一区日韩精品| 青青国产精品| 91九色综合| 精品亚洲免a| 美女视频黄久久| 麻豆精品蜜桃视频网站| 国产成人精品福利| 99久久夜色精品国产亚洲1000部| 亚洲免费观看| 97精品久久| 久久xxx视频| 99久久精品网站| 91精品精品| 午夜在线播放视频欧美| 亚洲在线久久| 美日韩一区二区三区| 综合精品一区| 国产aa精品| 日韩午夜电影| 亚洲青青久久| 日韩精品国产欧美| 日本精品久久| 久久国产精品色av免费看| 国产成人精品一区二区三区免费| 欧美日韩第一| 视频一区在线播放| 福利一区和二区| 蜜臀国产一区二区三区在线播放| 国产精品免费不| 欧美在线亚洲| 久久亚洲道色| 欧美成人高清| 国产一区2区| 91日韩在线| 蜜桃久久精品一区二区| 精品国产欧美日韩一区二区三区| 欧美综合二区| 水蜜桃久久夜色精品一区| 成人免费电影网址| 国产精品xxx| 亚洲日本欧美| 免费高清在线一区| 免费视频国产一区| 国产欧美日韩在线一区二区| 伊人成人网在线看| 日韩亚洲一区在线| 免费亚洲婷婷| 日本不卡视频一二三区| 激情视频网站在线播放色| 亚洲欧美日韩国产| 亚洲伊人av| 亚洲www免费| 97精品中文字幕| 久久蜜桃精品| 久久久影院免费| 精品丝袜久久| 精品久久一区| 午夜av不卡| 蜜乳av另类精品一区二区| 午夜av成人| 蜜桃精品在线| 99国产精品| 亚洲日本久久| 国产中文欧美日韩在线| 日本aⅴ免费视频一区二区三区| 伊人久久亚洲| 国产精品nxnn| 韩国久久久久久| 丰满少妇一区| 久久毛片亚洲| 欧美日韩国产一区二区三区不卡 | 欧美黄色网页| 亚洲精品88| 六月婷婷综合| 欧美在线综合| 国产精品久一| 91精品一区二区三区综合| 国产一区调教| 日韩中文影院| 日本在线不卡视频一二三区| 国产精品一区二区三区av麻| 日韩国产一区二区| 亚洲开心激情| 福利视频一区| 亚洲午夜黄色| 日韩精品欧美成人高清一区二区| 久久精品亚洲| 亚洲毛片在线| 中文字幕人成乱码在线观看 | 成人久久久久| 欧美日韩亚洲一区| 国产一区二区三区自拍| 亚洲一区欧美二区| 国产激情在线播放| 最新亚洲国产| 午夜久久美女| 日韩电影在线视频| 91精品国产自产在线丝袜啪| 婷婷激情一区| 国产精品久久乐| 一区二区精彩视频| 国产精品日韩欧美一区| 日韩大片免费观看| 欧美精品日日操| 美女性感视频久久| 欧美一区不卡| 免费日韩一区二区| 亚洲第一精品影视| 久久av免费看| 在线日韩成人| 国产66精品| 久久精品99国产精品| 亚洲我射av| 天堂va在线高清一区| 美女网站一区| 久久三级中文| 中文字幕在线官网| 国产色播av在线| 手机在线电影一区| 精品一区电影| 亚洲黄色中文字幕| 欧美激情综合| 免费在线亚洲欧美| 日本不卡一区二区三区| 国产精品成人国产| 综合亚洲色图| 亚洲免费成人| 国产综合亚洲精品一区二| 国产日韩欧美一区二区三区| 国产精品v一区二区三区| 九九99久久精品在免费线bt| 红桃视频国产一区| 一区二区三区四区日本视频| 亚洲精品护士| 爽好久久久欧美精品| 亚洲精品高潮| 美女视频一区在线观看| 精品视频在线一区二区在线| av在线最新| 精品一区亚洲| 日韩精品久久久久久| 欧美xxxx中国| 免费精品视频| 美女精品网站| 国产毛片精品| 新版的欧美在线视频| 亚洲精一区二区三区| 国产不卡av一区二区| 国产综合视频| 中文字幕日韩高清在线 | 奇米亚洲欧美| 日韩影院二区| 日韩中文字幕| 日韩黄色大片| 国产精品久av福利在线观看| 激情欧美日韩一区| 国产videos久久| 欧美亚洲tv| 欧美日中文字幕| 日韩专区视频网站| 国产专区一区| 国产精品美女在线观看直播| 日本不良网站在线观看| 欧美精品国产| 快she精品国产999| 日韩一区二区中文| 国产精品久久免费视频| 亚洲一区二区免费在线观看| 日本综合字幕| 黑森林国产精品av| 久久这里只有| 欧美日本三区| 久久国产麻豆精品| 日韩不卡在线观看日韩不卡视频| 午夜精品免费| 美女精品一区| 日日夜夜免费精品视频| 欧美 日韩 国产一区二区在线视频 | 国产精品久av福利在线观看|