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

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

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

瀏覽:158日期: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久久,三上悠亚国产精品一区二区三区
成人看片网站| 999久久久精品国产| 影音先锋久久精品| 国产精品tv| 日韩中文字幕一区二区三区| 久久这里只有精品一区二区| 天堂精品久久久久| 91精品91| 欧美特黄一区| 狠狠干综合网| 欧洲亚洲一区二区三区| 欧美一级网站| 视频国产精品| 蜜臀久久99精品久久久画质超高清| 日本美女一区| 在线日韩欧美| 精品视频国产| www.com.cn成人| 99久久亚洲精品蜜臀| 精品一区亚洲| 中文字幕日韩高清在线| 亚洲青青久久| 国产精品色在线网站| 成人综合一区| 亚洲午夜黄色| 日韩av字幕| 久久一区国产| 99久久亚洲精品蜜臀| 国产偷自视频区视频一区二区| 亚洲高清毛片| 伊人久久视频| 精品91久久久久| 亚洲丝袜啪啪| 欧美黑人巨大videos精品| 国产亚洲精品美女久久| 美女国产一区| 久久狠狠久久| 99久久亚洲精品蜜臀| 日韩精品一区二区三区中文 | 视频一区二区三区在线| 1024精品一区二区三区| 免费看的黄色欧美网站| 精品国产网站| 精品一区在线| 亚洲视频二区| 色天使综合视频| 日韩欧美激情电影| 97se综合| 国产欧美日韩影院| 国产精品成人自拍| 午夜亚洲精品| 黄色在线观看www| 国产毛片久久久| 国产精品人人爽人人做我的可爱| 国产精品久久久久久久久久妞妞| 成人国产精品久久| 亚洲精华国产欧美| 国产欧美一区二区三区精品酒店| 日本欧美在线| 久久激情综合网| 亚洲一区区二区| 欧美精品激情| 精品久久久中文字幕| 日韩精品社区| 麻豆国产91在线播放| 蜜臀va亚洲va欧美va天堂| 91亚洲一区| 精品精品99| 青青草精品视频| 爽好多水快深点欧美视频| 欧美精品99| 亚洲一区二区免费在线观看| 日本久久二区| 午夜电影亚洲| 精品国产乱码久久久久久樱花| 日韩美女国产精品| 成人精品久久| 精品黄色一级片| 国产精品一在线观看| 欧美专区一区二区三区| 国精品一区二区三区| 国产精品久久久久av电视剧| 免费福利视频一区二区三区| 久久成人av| 久久国产精品久久久久久电车| 久久网站免费观看| 国产精品麻豆成人av电影艾秋| 久久精品国产在热久久| 91精品精品| 黄在线观看免费网站ktv| 国产精品久久久一区二区| 欧美激情 亚洲a∨综合| 一本大道色婷婷在线| 欧美精品高清| 精品国产91| 偷拍欧美精品| 天堂va蜜桃一区二区三区| 深夜日韩欧美| 国产麻豆一区二区三区精品视频| 日韩国产一区二| 日韩国产一区二| 国产一区丝袜| 亚洲中字黄色| 亚洲精品麻豆| 日本va欧美va瓶| 欧美一级全黄| 国产一区二区三区网| 91精品成人| 国产麻豆一区| 欧美成人基地 | 日韩中文一区二区| 亚洲免费毛片| 国产一区二区三区久久| 六月天综合网| 福利一区和二区| 老鸭窝毛片一区二区三区| 狠狠色综合网| 精品国产一区二| 午夜在线观看免费一区| 日韩三区四区| 91精品一区二区三区综合| 日韩精品视频一区二区三区| 久久久久.com| 国产毛片精品| 91精品1区| 捆绑调教美女网站视频一区 | 牛牛精品成人免费视频| 狠狠久久伊人中文字幕| 欧美一级二区| 亚洲在线观看| 国产高潮在线| 97久久中文字幕| 丝袜亚洲另类欧美| 超级白嫩亚洲国产第一| 另类国产ts人妖高潮视频| 国产一区日韩欧美| 国产精品成久久久久| 精品国产中文字幕第一页| 日韩av网站在线免费观看| 香蕉国产精品| 久久激情婷婷| re久久精品视频| 给我免费播放日韩视频| 鲁大师成人一区二区三区| 精品国产午夜| 国产精品毛片aⅴ一区二区三区| 日本不卡在线视频| 中文av在线全新| 日韩欧美三级| 在线观看免费一区二区| 蜜桃视频欧美| 亚洲欧美专区| 国产精品久久久一区二区| 精品女同一区二区三区在线观看| 精品入口麻豆88视频| 亚洲精选久久| 日韩成人精品一区二区三区| 久久精品99久久久| 中文在线а√天堂| 日韩免费福利视频| 午夜久久tv| 日韩影院在线观看| 久久电影tv| 国产一区二区久久久久| 日韩1区2区日韩1区2区| 国产精品一区二区av日韩在线| 欧美私人啪啪vps| 欧美精品国产白浆久久久久| 精品亚洲免a| 91精品一区二区三区综合在线爱| 欧美.日韩.国产.一区.二区 | 麻豆久久一区二区| 午夜在线视频观看日韩17c| 亚洲bt欧美bt精品777| 国产精品15p| 女人天堂亚洲aⅴ在线观看| 欧美日韩国产精品一区二区亚洲| 日韩中文字幕| 水蜜桃久久夜色精品一区的特点| 亚洲精品成人一区| 亚洲一区二区三区四区五区午夜| 日本成人在线视频网站| 国产精品亚洲综合在线观看| 国产在线一区不卡| 狠狠干成人综合网| 无码日韩精品一区二区免费| 国产精品777777在线播放| 色综合狠狠操| 最新国产拍偷乱拍精品| 国产亚洲一区二区三区啪| 亚洲成人va| 亚洲色图综合| 福利片在线一区二区| 麻豆精品网站| 精品免费视频| 中文无码日韩欧| 日韩成人高清| 国产精品中文字幕亚洲欧美| 狠狠爱成人网| 韩国一区二区三区视频|