雨宫琴音电影|杏吧直播app官方下载|蕾丝小内内被撕开强入|影音先锋资源|国产 高速 亚洲 欧美 在线|今夜无人入睡免费完整版|97精品视频播放

當前位置:第一POS網 > 刷卡機知識點 >

觸屏刷卡機怎么刷卡

瀏覽:186 發布日期:2023-04-17 00:00:00 投稿人:佚名投稿

網上關于觸屏刷卡機怎么刷卡, 一步一步教你在SpringBoot中集成微信刷卡支付的刷卡知識比較多,也有關于觸屏刷卡機怎么刷卡的問題,今天第一pos網(m.fzog.com.cn)為大家整理刷卡常見知識,未來的我們終成一代卡神。

本文目錄一覽:

1、觸屏刷卡機怎么刷卡

觸屏刷卡機怎么刷卡

一:準備工作

使用微信支付需要先開通服務號,然后還要開通微信支付,最后還要配置一些開發參數,過程比較多。

申請服務號(企業)開通微信支付開發配置 \x08 具體準備工作請參考Spring Boot入門教程(三十九):微信支付集成-申請服務號和微信支付二:支付方式刷卡支付(MICROPAY) :刷卡支付是用戶展示微信錢包內的“刷卡條碼/二維碼”給商戶系統掃描后直接完成支付的模式。主要應用線下面對面收銀的場景。相當于支付寶的條碼支付掃碼支付:掃碼支付是商戶系統按微信支付協議生成支付二維碼,用戶再用微信“掃一掃”完成支付的模式。該模式適用于PC網站支付、實體店單品或訂單支付、媒體廣告支付等場景。相當于支付寶的電腦網站支付H5支付:H5支付是指商戶在微信客戶端外的移動端網頁展示商品或服務,用戶在前述頁面確認使用微信支付時,商戶發起本服務呼起微信客戶端進行支付。主要用于觸屏版的手機瀏覽器請求微信支付的場景??梢苑奖愕膹耐獠繛g覽器喚起微信支付。相當于支付寶的手機網站支付公眾號支付(JSAPI):商戶已有H5商城網站,用戶通過消息或掃描二維碼在微信內打開網頁時,可以調用微信支付完成下單購買的流程。App支付:APP支付又稱移動端支付,是商戶通過在移動端應用APP中集成開放SDK調起微信支付模塊完成支付的模式。小程序支付:在小程序中使用

H5支付: 是應用在微信客戶端外,是一種WAP支付。 公眾號支付(JSAPI): 是應用在微信內的一種支付。 兩種方式的應用場景不一樣。

三:刷卡支付場景介紹1. 場景介紹步驟1:用戶選擇刷卡支付付款并打開微信,進入“我”->“錢包”->“收付款”條碼界面;步驟2:收銀員在商戶系統操作生成支付訂單,用戶確認支付金額;步驟3:商戶收銀員用掃碼設備掃描用戶的條碼/二維碼,商戶收銀系統提交支付;步驟4:微信支付后臺系統收到支付請求,根據驗證密碼規則判斷是否驗證用戶的支付密碼,不需要驗證密碼的交易直接發起扣款,需要驗證密碼的交易會彈出密碼輸入框。支付成功后微信端會彈出成功頁面,支付失敗會彈出錯誤提示。2. 驗證密碼規則:支付金額>1000元的交易需要驗證用戶支付密碼用戶賬號每天最多有5筆交易可以免密,超過后需要驗證密碼微信支付后臺判斷用戶支付行為有異常情況,符合免密規則的交易也會要求驗證密碼3. 免密支付流程:

(1)收銀員在商戶收銀臺生成支付訂單,向用戶展示支付金額;

(2)用戶打開微信客戶端,點擊“我的錢包”,選擇“刷卡”,進入條碼界面;

(3)收銀員使用掃碼設備讀取用戶手機屏幕上的條碼;

(4)掃碼設備將讀取的信息上傳給門店收銀臺;

(5)門店收銀臺得到支付信息后,向商戶收銀后臺發起支付請求。

(6)商戶后臺對門店收銀臺的支付請求進行處理,生成簽名后調用【提交刷卡支付API】向微信支付系統發起支付請求。

(7)微信支付系統得到商戶側的支付請求之后會對請求進行驗證,驗證通過之后會對請求數據進行處理,最后將處理后的支付結果返回給商戶收銀后臺。如果支付成功,微信支付系統會將支付結果返回給商戶,同時把支付結果通知給用戶(以短信、微信消息的形式通知)。

(8)商戶收銀后臺對得到的支付結果進行簽名驗證和處理,再將支付結果返回給門店收銀臺。

(9)收銀員看到門店收銀臺的支付結果后給用戶發貨。

4. 驗密支付流程

驗密支付流程文檔

在商戶調用【提交刷卡支付API】發起支付請求之后,微信支付后臺提示用戶輸入密碼確認支付,接口同步返回USERPAYING狀態,商戶系統再輪詢調用查詢訂單接口來確認當前用戶是否已經支付成功。

以下時序圖說明驗密支付流程:

由于在商戶收銀后臺向微信支付系統發起支付請求之前的流程是完全一樣的,所以這里只介紹商戶發起支付請求之后的邏輯。

(1)商戶門店生成訂單后,收銀臺向后臺系統發起支付請求。

(2)后臺調用微信支付【提交刷卡支付API】生成支付交易。

(3)微信支付系統對商戶請求進行驗證,驗證通過后判斷當前用戶需要輸入密碼。

(4)微信支付系統返回USERPAYING狀態,商戶后臺系統將應答結果返回給商戶門店收銀臺。

(5)微信支付系統通知用戶微信客戶端輸入密碼。

(6)用戶得到輸入密碼提示后,確認支付并輸入密碼。

(7)完成密碼輸入,提交微信支付。

(8)微信客戶端在用戶完成支付后提示微信支付后臺系統返回的支付結果,而且微信支付系統會通過短信、微信消息給用戶發送支付結果提醒。

(9)商戶收銀臺得到USERPAYING狀態后,經過商戶后臺系統調用【查詢訂單API】查詢實際支付結果。

(10)如果支付結果仍為USERPAYING,則每隔5秒循環調用【查詢訂單API】判斷實際支付結果,如果用戶取消支付或累計30秒用戶都未支付,商戶收銀臺退出查詢流程后繼續調用【撤銷訂單API】撤銷支付交易。

5. 異常處理

用戶遇到支付異常,請按如下說明處理

(1)用戶微信端彈出系統錯誤提示框,用戶可在交易列表查看交易情況,如果未找到訂單,需要商戶重新發起支付交易;如果訂單顯示成功支付,商戶收銀系統再次調用【查詢訂單API】查詢實際支付結果;

(2)用戶微信端彈出支付失敗提示,例如:余額不足,信用卡失效。需要重新發起支付;

(3)當交易超時或支付交易失敗,商戶收銀系統必須調用【撤銷訂單API】,撤銷此交易。

(4)由于銀行系統異常、用戶余額不足、不支持用戶卡種等原因使當前支付交易失敗,商戶收銀系統應該把錯誤提示明確展示給收銀員。

(5)根據返回的錯誤碼,判斷是否需要撤銷交易,具體詳見API返回錯誤碼列表

public Map<String, String> microPayWithPos(Map<String, String> reqData) throws Exception { return this.microPayWithPos(reqData, this.config.getHttpConnectTimeoutMs());}/** * 提交刷卡支付,針對軟POS,盡可能做成功 * 內置重試機制,最多60s * @param reqData * @param connectTimeoutMs * @return * @throws Exception */public Map<String, String> microPayWithPos(Map<String, String> reqData, int connectTimeoutMs) throws Exception { int remainingTimeMs = 60*1000; long startTimestampMs = 0; Map<String, String> lastResult = null; Exception lastException = null; while (true) { startTimestampMs = WXPayUtil.getCurrentTimestampMs(); int readTimeoutMs = remainingTimeMs - connectTimeoutMs; if (readTimeoutMs > 1000) { try { lastResult = this.microPay(reqData, connectTimeoutMs, readTimeoutMs); String returnCode = lastResult.get("return_code"); if (returnCode.equals("SUCCESS")) { String resultCode = lastResult.get("result_code"); String errCode = lastResult.get("err_code"); if (resultCode.equals("SUCCESS")) { break; } else { // 看錯誤碼,若支付結果未知,則重試提交刷卡支付 if (errCode.equals("SYSTEMERROR") || errCode.equals("BANKERROR") || errCode.equals("USERPAYING")) { remainingTimeMs = remainingTimeMs - (int)(WXPayUtil.getCurrentTimestampMs() - startTimestampMs); if (remainingTimeMs <= 100) { break; } else { WXPayUtil.getLogger().info("microPayWithPos: try micropay again"); if (remainingTimeMs > 5*1000) { Thread.sleep(5*1000); } else { Thread.sleep(1*1000); } continue; } } else { break; } } } else { break; } } catch (Exception ex) { lastResult = null; lastException = ex; } } else { break; } } if (lastResult == null) { throw lastException; } else { return lastResult; }}

看Demo中的方法,整個方法也沒有查詢訂單,也沒有撤銷訂單的操作,而是不停的重復調用microPay,這和上面文檔的(9)、(10)條邏輯不一樣

注意:微信的刷卡支付并沒有支付通知接口,只有退款通知接口;支付寶的條碼支付是有支付通知接口的,兩家是不一樣的。四:開發文檔

在集成之前,一定要熟悉業務,熟悉文檔

微信支付開發文檔

刷卡文檔,開發前請詳細認證的看完該文檔。

刷卡支付流程圖 必須看

刷卡文檔中有demo,SDK與DEMO下載,需要下載下來,熟悉一下項目結構,以及READEME.md

五:集成步驟1. 引入SDKwxpay-sdk 項目中的src就是要引入的sdk,可以直接將src的所有7個源文件拖入到自己項目中wxpay-sdk 的READEME.md中說可以通過maven來引入sdk

現在有兩種方式,選擇其中一種,究竟選哪一種?

wxpay-sdk的src下面有7個Java文件,通過maven引入可以看到的sdk中就4個java文件,兩種方式文件個數不一致,多出來的3個文件是demo中用到的文件,并不是原始sdk中的文件,通過查看sdk中的源碼可以看到,這4個文件其實就是使用httpclient來調用微信支付的支付接口,其中很多重要的邏輯并沒有按照官方文檔中說的那樣缺少重要的邏輯實現,這個需要自己去完善一些邏輯

開發中發現WXPay這個類和maven中的類并不完全一樣,多了兩個方法microPayWithPos,其中這兩個方法是demo作者自己基于內部方法microPay的一個封裝,完善了部分邏輯, 但是完善的邏輯和官網文檔的描述不一致,有重大邏輯問題

查看demo中的test發現竟然有一個類叫test,命名不清晰,語義太籠統,而且還是小寫字母開頭,不符合Java的基本命名規范,關于java中的測試的命名規則一般類名以Test作為后綴,而該demo以Test作為前綴,一般測試類方法的命名以test作為前綴,但是demo中的測試并沒有什么test,一般測試類都要使用測試框架如Junit等,但是demo中的測試并沒有使用測試框架,而是使用main方法來運行的。

對wxpay-sdk的評價:wxpay-sdk只是使用httpclient來調用微信支付的接口,只管調用微信支付接口,然后解析一下響應,并不處理支付中的業務邏輯,盡管一些和支付密切相關的重要邏輯也不會處理,甚至解密的工具方法都沒有現成的,需要開發者自己去處理??磀emo可以知道,寫的不是一般的爛,沒想到微信那么大的廠竟然sdk寫的這么懶,demo寫的這么low,真是丟人,和支付寶的sdk比一個地下一個天上。

罵完了,還是要集成的,這里我選擇不相信demo的源文件,使用README.md中的maven來引入sdk,一個是demo寫的太爛,多出來的文件也不是不要不行的,多出來的方法有重大邏輯缺陷,萬一哪天微信哪天良心發現完善sdk了,更新了maven版本,自己只需要修改一下maven的版本號就行了。

<dependency> <groupId>com.github.wxpay</groupId> <artifactId>wxpay-sdk</artifactId> <version>0.0.3</version></dependency>2. application.yml

配置微信支付參數,其中appID、mchID、key、certPath是必須的,notifyUrl是可選的,sandboxKey和useSandbox是自己配置的,便于正式環境和沙箱環境的切換,關于參數的值去微信的開發配置中查看

useSandbox:true表示使用沙箱環境,如果為false為正式環境sandboxKey: 沙箱環境API秘鑰,需要通過下面的WXPayClient#getSignKey方法獲取

pay: wxpay: appID: xxx mchID: xxx key: xxx sandboxKey: xxx certPath: /var/local/cert/apiclient_cert.p12 notifyUrl: http://65ta5j.natappfree.cc/wxpay/refund/notify useSandbox: false3. MyWXPayConfig

配置微信參數,其實就是一種Properties類,需要實現WXPayConfig中的方法 注意:demo中的WXPayConfig是一種抽象類abstract class,可以看到maven與demo的不統一

/** * 微信支付的參數配置 * * @author mengday zhang */@Data@Slf4j@ConfigurationProperties(prefix = "pay.wxpay")public class MyWXPayConfig implements WXPayConfig { /** 公眾賬號ID */ private String appID; /** 商戶號 */ private String mchID; /** API 密鑰 */ private String key; /** API 沙箱環境密鑰 */ private String sandboxKey; /** API證書絕對路徑 */ private String certPath; /** 退款異步通知地址 */ private String notifyUrl; private Boolean useSandbox; /** HTTP(S) 連接超時時間,單位毫秒 */ private int httpConnectTimeoutMs = 8000; /** HTTP(S) 讀數據超時時間,單位毫秒 */ private int httpReadTimeoutMs = 10000; /** * 獲取商戶證書內容 * * @return 商戶證書內容 */ @Override public InputStream getCertStream() { File certFile = new File(certPath); InputStream inputStream = null; try { inputStream = new FileInputStream(certFile); } catch (FileNotFoundException e) { log.error("cert file not found, path={}, exception is:{}", certPath, e); } return inputStream; } @Override public String getKey(){ if (useSandbox) { return sandboxKey; } return key; }}4. WXPayClient

WXPayClient 是對WXPay的一個封裝,增加了microPayWithPOS方法,內部調用WXPay#microPay,但是sdk中的microPay并沒有處理當微信支付時微信提示用戶輸入密碼,這時sdk直接返回的錯誤,這里處理的邏輯就是在指定時間內去輪詢支付結果,然后將輪詢的結果返回出去,而不是就直接返回錯誤了,demo項目也有個microPayWithPOS實現,但是它的邏輯是當用戶輸入密碼的情況會輪詢的去下單去調用WXPay#microPay,這種做法是不符合微信的官方文檔的。另外增加了獲取沙箱環境API秘鑰和解密退換通知的方法。

吐槽一下:感覺像這種解密方法WXPayUtil中竟然沒有,這是必須的不可少的啊,怎么會沒有呢,這也太爛了吧,這還稱為sdk啊

/** * WXPayClient * <p> * 對WXPay的簡單封裝,處理支付密切相關的邏輯. * * @author Mengday Zhang * @version 1.0 * @since 2018/6/16 */@Slf4jpublic class WXPayClient extends WXPay { /** 密鑰算法 */ private static final String ALGORITHM = "AES"; /** 加解密算法/工作模式/填充方式 */ private static final String ALGORITHM_MODE_PADDING = "AES/ECB/PKCS5Padding"; /** 用戶支付中,需要輸入密碼 */ private static final String ERR_CODE_USERPAYING = "USERPAYING"; private static final String ERR_CODE_AUTHCODEEXPIRE = "AUTHCODEEXPIRE"; /** 交易狀態: 未支付 */ private static final String TRADE_STATE_NOTPAY = "NOTPAY"; /** 用戶輸入密碼,嘗試30秒內去查詢支付結果 */ private static Integer remainingTimeMs = 10000; private WXPayConfig config; public WXPayClient(WXPayConfig config, WXPayConstants.SignType signType, boolean useSandbox) { super(config, signType, useSandbox); this.config = config; } /** * * 刷卡支付 * * 對WXPay#microPay(Map)增加了當支付結果為USERPAYING時去輪詢查詢支付結果的邏輯處理 * * 注意:該方法沒有處理return_code=FAIL的情況,暫時不考慮網絡問題,這種情況直接返回錯誤 * * @param reqData * @return * @throws Exception */ public Map<String, String> microPayWithPOS(Map<String, String> reqData) throws Exception { // 開始時間(毫秒) long startTimestampMs = System.currentTimeMillis(); Map<String, String> responseMapForPay = super.microPay(reqData); log.info(responseMapForPay.toString()); // // 先判斷 協議字段返回(return_code),再判斷 業務返回,最后判斷 交易狀態(trade_state) // 通信標識,非交易標識 String returnCode = responseMapForPay.get("return_code"); if (WXPayConstants.SUCCESS.equals(returnCode)) { String errCode = responseMapForPay.get("err_code"); // 余額不足,信用卡失效 if (ERR_CODE_USERPAYING.equals(errCode) || "SYSTEMERROR".equals(errCode) || "BANKERROR".equals(errCode)) { Map<String, String> orderQueryMap = null; Map<String, String> requestData = new HashMap<>(); requestData.put("out_trade_no", reqData.get("out_trade_no")); // 用戶支付中,需要輸入密碼或系統錯誤則去重新查詢訂單API err_code, result_code, err_code_des // 每次循環時的當前系統時間 - 開始時記錄的時間 > 設定的30秒時間就退出 while (System.currentTimeMillis() - startTimestampMs < remainingTimeMs) { // 商戶收銀臺得到USERPAYING狀態后,經過商戶后臺系統調用【查詢訂單API】查詢實際支付結果。 orderQueryMap = super.orderQuery(requestData); String returnCodeForQuery = orderQueryMap.get("return_code"); if (WXPayConstants.SUCCESS.equals(returnCodeForQuery)) { // 通訊成功 String tradeState = orderQueryMap.get("trade_state"); if (WXPayConstants.SUCCESS.equals(tradeState)) { // 如果成功了直接將查詢結果返回 return orderQueryMap; } // 如果支付結果仍為USERPAYING,則每隔5秒循環調用【查詢訂單API】判斷實際支付結果 Thread.sleep(1000); } } // 如果用戶取消支付或累計30秒用戶都未支付,商戶收銀臺退出查詢流程后繼續調用【撤銷訂單API】撤銷支付交易。 String tradeState = orderQueryMap.get("trade_state"); if (TRADE_STATE_NOTPAY.equals(tradeState) || ERR_CODE_USERPAYING.equals(tradeState) || ERR_CODE_AUTHCODEEXPIRE.equals(tradeState)) { Map<String, String> reverseMap = this.reverse(requestData); String returnCodeForReverse = reverseMap.get("return_code"); String resultCode = reverseMap.get("result_code"); if (WXPayConstants.SUCCESS.equals(returnCodeForReverse) && WXPayConstants.SUCCESS.equals(resultCode)) { // 如果撤銷成功,需要告訴客戶端已經撤銷訂單了 responseMapForPay.put("err_code_des", "用戶取消支付或尚未支付,后臺已經撤銷該訂單,請重新支付!"); } } } } return responseMapForPay; } /** * 解密退款通知 * * <a href="https://pay.weixin.qq.com/wiki/doc/api/micropay.php?chapter=9_16&index=11>退款結果通知文檔</a> * @param reqInfo * @return * @throws Exception */ public Map<String, String> decodeRefundNotify(String reqInfo) throws Exception { //(1)對加密串A做base64解碼,得到加密串B byte[] bytes = new BASE64Decoder().decodeBuffer(reqInfo); //(2)對商戶key做md5,得到32位小寫key* ( key設置路徑:微信商戶平臺(pay.weixin.qq.com)-->賬戶設置-->API安全-->密鑰設置 ) Cipher cipher = Cipher.getInstance(ALGORITHM_MODE_PADDING); SecretKeySpec key = new SecretKeySpec(WXPayUtil.MD5(config.getKey()).toLowerCase().getBytes(), ALGORITHM); cipher.init(Cipher.DECRYPT_MODE, key); // (3)用key*對加密串B做AES-256-ECB解密(PKCS7Padding) // java.security.InvalidKeyException: Illegal key size or default parameters // https://www.cnblogs.com/yaks/p/5608358.html String responseXml = new String(cipher.doFinal(bytes),"UTF-8"); Map<String, String> responseMap = WXPayUtil.xmlToMap(responseXml); return responseMap; } /** * 獲取沙箱環境驗簽秘鑰API * <a href="https://pay.weixin.qq.com/wiki/doc/api/micropay.php?chapter=23_1">獲取驗簽秘鑰API文檔</a> * @return * @throws Exception */ public Map<String, String> getSignKey() throws Exception { Map<String, String> reqData = new HashMap<>(); reqData.put("appid", config.getAppID()); reqData.put("mch_id", config.getMchID()); reqData.put("nonce_str", WXPayUtil.generateNonceStr()); String sign = WXPayUtil.generateSignature(reqData, config.getKey(), WXPayConstants.SignType.MD5); reqData.put("sign", sign); String responseXml = this.requestWithoutCert("https://api.mch.weixin.qq.com/sandboxnew/pay/getsignkey", reqData, config.getHttpConnectTimeoutMs(), config.getHttpReadTimeoutMs()); Map<String, String> responseMap = WXPayUtil.xmlToMap(responseXml); return responseMap; }}5. WXPayConfiguration

/** * 微信支付配置 * * @author mengday zhang */@Configuration@EnableConfigurationProperties(MyWXPayConfig.class)public class WXPayConfiguration { @Autowired private MyWXPayConfig wxPayConfig; /** * useSandbox true為沙盒環境 * @return */ @Bean public WXPay wxPay() { return new WXPay(wxPayConfig, WXPayConstants.SignType.MD5, wxPayConfig.getUseSandbox() ); } @Bean public WXPayClient wxPayClient() { return new WXPayClient(wxPayConfig, WXPayConstants.SignType.MD5, wxPayConfig.getUseSandbox()); }}6. WXPayMicroPayController

/** * 微信支付-刷卡支付. * <p> * detailed description * * @author Mengday Zhang * @version 1.0 * @since 2018/6/18 */@Slf4j@RestController@RequestMapping("/wxpay/microPay")public class WXPayMicroPayController { @Autowired private WXPayClient wxPayClient; /** * 刷卡支付(類似支付寶的條碼支付) * * 和支付寶的好像不一樣,支付寶有支付通知,但是微信好像沒,微信有退款通知 * * 微信支付后臺系統收到支付請求,根據驗證密碼規則判斷是否驗證用戶的支付密碼,不需要驗證密碼的交易直接發起扣款, * 需要驗證密碼的交易會彈出密碼輸入框。支付成功后微信端會彈出成功頁面,支付失敗會彈出錯誤提示 * 注意該接口有可能返回錯誤碼為USERPAYING用戶支付中 * * 驗證密碼規則 * ◆ 支付金額>1000元的交易需要驗證用戶支付密碼 * ◆ 用戶賬號每天最多有5筆交易可以免密,超過后需要驗證密碼 * ◆ 微信支付后臺判斷用戶支付行為有異常情況,符合免密規則的交易也會要求驗證密碼 * * 用戶刷卡條形碼規則:18位純數字,以10、11、12、13、14、15開頭 */ @PostMapping("") public Object microPay(String authCode) throws Exception { Map<String, String> reqData = new HashMap<>(); // 商戶訂單號 reqData.put("out_trade_no", String.valueOf(System.nanoTime())); // 訂單總金額,單位為分,只能為整數 reqData.put("total_fee", "2"); // 授權碼 reqData.put("auth_code", authCode); // 商品描述 reqData.put("body", "測試"); Map<String, String> resultMap = wxPayClient.microPayWithPOS(reqData); log.info(resultMap.toString()); return resultMap; }}7. WXPayController

/** * 微信支付 - 通用API. * * <p> * 類似支付寶中的條碼支付. * * @author Mengday Zhang * @version 1.0 * @since 2018/6/15 */@Slf4j@RestController@RequestMapping("/wxpay")public class WXPayController { @Autowired private WXPay wxPay; @Autowired private WXPayClient wxPayClient; @Autowired private MyWXPayConfig wxPayConfig; /** * 訂單查詢 * @param orderNo * @return * @throws Exception */ @GetMapping("/orderQuery") public Object orderQuery(String orderNo) throws Exception { Map<String, String> data = new HashMap<>(); data.put("out_trade_no", orderNo); Map<String, String> result = wxPay.orderQuery(data); return result; } /** * 退款 * 注意:調用申請退款、撤銷訂單接口需要商戶證書 * 注意:沙箱環境響應結果可能會是"沙箱支付金額不正確,請確認驗收case",但是正式環境不會報這個錯誤 * 微信支付的最小金額是0.1元,所以在測試支付時金額必須大于0.1元,否則會提示微信支付配置錯誤,可以將microPay的total_fee大于1再退款 */ @PostMapping("/refund") public Object refund(String orderNo) throws Exception { Map<String, String> reqData = new HashMap<>(); // 商戶訂單號 reqData.put("out_trade_no", orderNo); // 授權碼 reqData.put("out_refund_no", orderNo); // 訂單總金額,單位為分,只能為整數 reqData.put("total_fee", "2"); //退款金額 reqData.put("refund_fee", "2"); // 退款異步通知地址 reqData.put("notify_url", wxPayConfig.getNotifyUrl()); reqData.put("refund_fee_type", "CNY"); reqData.put("op_user_id", wxPayConfig.getMchID()); Map<String, String> resultMap = wxPay.refund(reqData); log.info(resultMap.toString()); return resultMap; } /** * 退款結果通知 * * 特別說明:退款結果對重要的數據進行了加密,商戶需要用商戶秘鑰進行解密后才能獲得結果通知的內容 * @param request * @throws Exception */ @RequestMapping("/refund/notify") public String refundNotify(HttpServletRequest request) throws Exception {// Map<String, String> notifyMap = new HashMap<>();// notifyMap.put("nonce_str", "9b4e428ae262d5dca96178027e849fa9");// notifyMap.put("req_info", "VKGj8c81RwQ45LcyWEVBE9/HsNfADGbgmbIAQZ2ydcbIFhIIcJFKFQwGfcSGgFGtQlWvg6KDNsRjmCjN+PvipJ3roynJ7cME0LOFG50VGtk4EYHqdjFzUVANI7GpT+i6Ok+ZWivH0MwoGK2fsz3WG+bYs2XJBwav/K89tKjFhZGitCKKBeGqcP99fa/gAL0swNXXNQHmL806Zi+QcACzL3E89BtP9FlXM2Gi+wPQafvPr+/iE+LrPdMlNUa5LiZnenZXUF24kMdhaTafczcKL4sZjRXQHEfEyc/pIZPbIjcNIETvHsskyzKuHVr/SAFkxaM6RR1Kl9pyWZGUjkH5SOeqsT8uL7YQmTlDXrnXmno3AvZdnepTGL5w69yIOmQNPeMqsd01ES9WX36GZYOigfi2+BJ9RRXjIffmpB/MFF+zryyvLTaJE2obCwFSHrmOD8YbaJqrZXOUvWZQrn7wIQgaCypo8V57cD3w5d2RSgIHNrdnEDYlbRcLNYgKuL+T9+1HPhU/frowZgwPN9IB53OahZV3p1Yvos23kvhqPCLn3BYgUihRbey6QhEtL2QyifiQ9e8WVLzWpRZ+DOa8VrhYvSuTfjRdjoNanqHFvXGP6uEsEa+DETqnexpB7xOS9m/CdmlNCwbdUplPEVzNQQdzYT4kybi00Y8A+EdairxfVyK9A7MAYAMtAO9yxV2ht0bn3SofFyZe/YSzdJgxdtcxBf1CVYN6x+yHcSueCSgq4cM/2VCwh4J1+pUVmNpEm0OVcdKbV5USkaxJR0h7Yd+n5FTz5Q2S/qvyDo202cUzLFPI5UqQm5X+FOrWDAkmmr5yVcDQIm3dAdb31jkz0X2TPYt5g7ciQ1h9heyVxJ67FexKvEM4pKCCubtWx6nyxcOUghHMrh8DSoBtewtNjbnwGVIbLsSb6X9MIYAkWIDbqNVP1f63GiZU+cJlhBmvcb8aeQUdTTj7EX5pOTIVSVv5D6SkKmpGU4FGvV+WjufuGX4ZRZo+01p6xl0sfZVmucG1UtxhX6bMCJb06yDwxpv7tGwkwS4TCK4SQp40Xe0=");// notifyMap.put("appid", "xxx");// notifyMap.put("mch_id", "xxx");// notifyMap.put("return_code", "SUCCESS"); // 注意:同樣的通知可能會多次發送給商戶系統。商戶系統必須能夠正確處理重復的通知。 // 推薦的做法是,當收到通知進行處理時,首先檢查對應業務數據的狀態,判斷該通知是否已經處理過,如果沒有處理過再進行處理,如果處理過直接返回結果成功。 // 在對業務數據進行狀態檢查和處理之前,要采用數據鎖進行并發控制,以避免函數重入造成的數據混亂。 // TODO 處理業務 Map<String, String> requstInfoMap = wxPayClient.decodeRefundNotify(request); // 商戶處理退款通知參數后同步返回給微信參數 Map<String, String> responseMap = new HashMap<>(); responseMap.put("return_code", "SUCCESS"); responseMap.put("return_msg", "OK"); String responseXml = WXPayUtil.mapToXml(responseMap); return responseXml; } /** * 退款查詢 * @param orderNo * @return * @throws Exception */ @GetMapping("/refundQuery") public Object refundQuery(String orderNo) throws Exception { Map<String, String> reqData = new HashMap<>(); reqData.put("out_trade_no", orderNo); Map<String, String> result = wxPay.refundQuery(reqData); return result; } /** * 下載對賬單 * 注意: * 微信在次日9點啟動生成前一天的對賬單,建議商戶10點后再獲??; * 對賬單接口只能下載三個月以內的賬單。 * @throws Exception */ @PostMapping("/downloadBill") public Object downloadBill(String billDate) throws Exception { Map<String, String> reqData = new HashMap<>(); reqData.put("bill_date", billDate); reqData.put("bill_type", "ALL"); Map<String, String> resultMap = wxPay.downloadBill(reqData); return resultMap; } /** * 獲取沙箱環境API秘鑰, * * 這里只是為了獲取,可以放在main方法下運行,這里作為api來運行的,實際情況下不應該暴露出來 * @return * @throws Exception */ @GetMapping("/sandbox/getSignKey") public Object getSignKey() throws Exception { Map<String, String> signKey = wxPayClient.getSignKey(); log.info(signKey.toString()); return signKey; }}獲取源碼

關注并私信“微信刷卡支付”獲取源代碼。

以上就是關于觸屏刷卡機怎么刷卡, 一步一步教你在SpringBoot中集成微信刷卡支付的知識,后面我們會繼續為大家整理關于觸屏刷卡機怎么刷卡的知識,希望能夠幫助到大家!

轉載請帶上網址:http://m.fzog.com.cn/shuaka/51512.html

版權聲明:本文內容由互聯網用戶自發貢獻,該文觀點僅代表作者本人。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如發現本站有涉嫌抄襲侵權/違法違規的內容, 請發送郵件至 babsan@163.com 舉報,一經查實,本站將立刻刪除。
聯系我們
訂購聯系:小莉
微信聯系方式
地址:深圳市寶安區固戍聯誠發產業園木星大廈

公司地址:深圳市寶安區固戍聯誠發產業園木星大廈

舉報投訴 免責申明 版權申明 廣告服務 投稿須知 技術支持:第一POS網 Copyright@2008-2030 深圳市慧聯實業有限公司 備案號:粵ICP備18141915號