日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

java对接银联商务公众号+服务窗支付(1)

發(fā)布時間:2024/3/26 编程问答 53 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java对接银联商务公众号+服务窗支付(1) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

java實(shí)現(xiàn)銀聯(lián)商務(wù)公眾號+服務(wù)窗對接----支付下單

GitLab地址:https://gitlab.com/982837387/UnionPayGetWay.git
本文對接銀聯(lián)商務(wù)公眾號+服務(wù)窗支付,實(shí)現(xiàn)支付下單、訂單查詢、訂單退款、退款查詢和訂單關(guān)閉幾個功能,使用到銀聯(lián)商務(wù)的公眾+服務(wù)窗支付接口規(guī)范,請自行百度下載。
一、接入前準(zhǔn)備
創(chuàng)建maven項(xiàng)目,項(xiàng)目目錄如下,各目錄功能不再詳細(xì)介紹,直接看接口和功能。

二、接口及代碼實(shí)現(xiàn)
1.支付下單接口
1.1接口規(guī)范
接口規(guī)范請查看下載的銀聯(lián)商務(wù)公眾號+服務(wù)窗接口規(guī)范下單接口部分,這里不做展示。
1.2 代碼實(shí)現(xiàn)
1.2.1 UnionPayOnlineController代碼

package com.unionpay.controller;import java.io.UnsupportedEncodingException; import java.net.URLDecoder; import java.util.HashMap; import java.util.Map;import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse;import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.CrossOrigin; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod;@Controller @CrossOrigin @RequestMapping("/lay") public class UnionPayOnlineController {private final static Logger logger = LoggerFactory.getLogger(UnionPayOnlineController.class);@Autowiredprivate UnifiedOrderServiceimpl unionpayserviceimpl;/*** 公眾號支付下單接口* 調(diào)用該接口,跳轉(zhuǎn)到html支付頁面* @param request* @param response* @param jsonreq* @return* @throws UnsupportedEncodingException */@RequestMapping(value = "/UnifiedPay", method = RequestMethod.GET)public String unionpay(HttpServletRequest request, HttpServletResponse response,Map resultdatamap) throws UnsupportedEncodingException {Map datamap = new HashMap(); //客戶端請求數(shù)據(jù)String key = UnionPayConstants.GGMD5KEY; //國光MD5密鑰//---------------------取到URL請求數(shù)據(jù)----------------------------------------------------logger.info("getQueryString:" + request.getQueryString()); //請求url的QueryStringString mid = request.getParameter("mid");String tid = request.getParameter("tid");String instMid = request.getParameter("instMid");String msgSrc = request.getParameter("msgSrc");String totalAmount = request.getParameter("totalAmount");String payType = request.getParameter("payType");String notifyUrl = request.getParameter("notifyUrl");String returnUrl = request.getParameter("returnUrl");String sign = request.getParameter("sign");//--------------------step1 對請求字段值進(jìn)行URLDecoder轉(zhuǎn)碼----------------------------datamap.put("mid",URLDecoder.decode(mid, "UTF-8"));datamap.put("tid",URLDecoder.decode(tid, "UTF-8"));datamap.put("instMid",URLDecoder.decode(instMid, "UTF-8"));datamap.put("msgSrc",URLDecoder.decode(msgSrc, "UTF-8"));datamap.put("totalAmount",URLDecoder.decode(totalAmount, "UTF-8"));datamap.put("msgType",URLDecoder.decode(payType, "UTF-8"));datamap.put("notifyUrl",URLDecoder.decode(notifyUrl, "UTF-8"));datamap.put("returnUrl",URLDecoder.decode(returnUrl, "UTF-8"));logger.info("URLDecoder轉(zhuǎn)碼后datamap = " + datamap);//-------------------------step2驗(yàn)證簽名------------------------------------------------------try {if (!PayUtil.verifySign(datamap,key,sign)) {resultdatamap.put("returnInfo", "簽名錯誤");resultdatamap.put("returnCode", "Bad_Sign");//String failureurl = unionpayserviceimpl.CreatefailureUrl(resultmap);//logger.info("url = " + failureurl);return "failure"; }//-----------------------step3 驗(yàn)證傳參完整性-------------------------- //驗(yàn)證公共參數(shù)完整性if(!PayUtil.verifyParameter(datamap)) {resultdatamap.put("returnCode", "Common_Value_Error");resultdatamap.put("returnInfo", "缺少必要公共參數(shù)");return "failure";}//驗(yàn)證接口參數(shù)完整性if(datamap.get("totalAmount").equals("") || datamap.get("msgType").equals("") || datamap.get("notifyUrl").equals("") || datamap.get("returnUrl").equals("") ) {resultdatamap.put("returnCode", "Value_Error");resultdatamap.put("returnInfo", "缺少必要接口參數(shù),必傳接口參數(shù)不允許為空");return "failure";}} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();resultdatamap.put("returnCode", "System_Error");resultdatamap.put("returnInfo", "系統(tǒng)異常");return "failure";}//-----------------------step4 傳值并生成鏈接跳轉(zhuǎn)到支付頁面--------------------------------//Map resultdatamap = new HashMap();resultdatamap.put("mid", mid); //商戶號resultdatamap.put("tid", tid); //終端號resultdatamap.put("instMid", instMid); //機(jī)構(gòu)商戶號resultdatamap.put("msgSrc", msgSrc); //消息來源resultdatamap.put("totalAmount", totalAmount); //總金額resultdatamap.put("msgType", payType); //支付類型resultdatamap.put("notifyUrl", notifyUrl); //支付結(jié)果通知resultdatamap.put("returnUrl", returnUrl); //網(wǎng)頁跳轉(zhuǎn)地址resultdatamap.put("merOrderId", unionpayserviceimpl.CreateOrderID()); //生成商戶訂單號logger.info("resultdatamap = " + resultdatamap);//根據(jù)payType判斷回調(diào)到哪個支付頁面if(resultdatamap.get("msgType").equals("WXPay.jsPay")) { //微信支付return "wxunionpay";}else {return "aliunionpay"; //支付寶支付}}/*** a支付失敗頁面* @param request* @param response* @param returnCode* @param map* @return*/@RequestMapping(value = "/failure", method = RequestMethod.GET)public String failure(HttpServletRequest request, HttpServletResponse response,String returnCode,Map map) {map.put("returnCode", returnCode); return "failure"; }/*** a根據(jù)支付頁面請求,調(diào)起支付下單* @param request* @param response* @param totalAmount* @param msgType* @return*/@RequestMapping(value = "/unifiedpay", method = RequestMethod.GET)public String index(HttpServletRequest request, HttpServletResponse response, Map map) {Map reqmap = new HashMap();//---------------------取到URL請求數(shù)據(jù)-----------------------------logger.info("unifiedpay getQueryString:" + request.getQueryString()); //請求url的QueryStringString mid = request.getParameter("mid");String tid = request.getParameter("tid");String instMid = request.getParameter("instMid");String msgSrc = request.getParameter("msgSrc");String totalAmount = request.getParameter("totalAmount");String YtotalAmount = PayUtil.changeY2F(totalAmount); //元轉(zhuǎn)分logger.info("YtotalAmount = " + YtotalAmount);String msgType = request.getParameter("msgType");String notifyUrl = request.getParameter("notifyUrl");String returnUrl = request.getParameter("returnUrl");String merOrderId = request.getParameter("merOrderId");reqmap.put("mid", mid);reqmap.put("tid", tid);reqmap.put("instMid", instMid);reqmap.put("msgSrc", msgSrc);reqmap.put("totalAmount", YtotalAmount);reqmap.put("msgType", msgType);reqmap.put("notifyUrl", notifyUrl);reqmap.put("returnUrl", returnUrl);reqmap.put("merOrderId", merOrderId);logger.info("reqmap = " + reqmap);String url = "";try {url = unionpayserviceimpl.UnifiedOrder(reqmap);//logger.info("請求URL = " + url);} catch (UnsupportedEncodingException e) {// TODO Auto-generated catch blocke.printStackTrace();} // if(url.equals("缺少必要參數(shù),請核實(shí)后再進(jìn)行下單")) { // map.put("returnCode", "缺少必要參數(shù),請核實(shí)后再進(jìn)行下單"); // return "failure"; // }return "redirect:" + url; //重定向到下單頁面 }}

1.2.2 UnionpayServiceimpl代碼
本部分代碼為銀聯(lián)商務(wù)支付下單接口服務(wù)。

/*** 銀聯(lián)商務(wù)支付下單* return map* @throws UnsupportedEncodingException */@Overridepublic String UnifiedOrder(Map map) throws UnsupportedEncodingException {// TODO Auto-generated method stubMap reqmap = new HashMap(); //請求銀聯(lián)商務(wù)mapreqmap.put("mid", map.get("mid")); //商戶號reqmap.put("tid", map.get("tid")); //終端號reqmap.put("instMid", map.get("instMid"));reqmap.put("msgSrc", map.get("msgSrc")); //消息來源reqmap.put("msgId", "UnionPay_F001"); //自定義reqmap.put("msgType", map.get("msgType")); //支付類型,前端傳入//報文請求時間String aligetTime = PayUtil.aligetTime();logger.info("end_time = " + aligetTime);reqmap.put("requestTimestamp", aligetTime); //商戶訂單號//reqmap.put("msgSrcId", this.msgSrcId); //來源編號 // String orderid = GGitUtil.createOrderID(); // StringBuffer buff = new StringBuffer(); // buff.append(this.msgSrcId); // buff.append(orderid);reqmap.put("merOrderId", map.get("merOrderId"));reqmap.put("originalAmount", map.get("totalAmount")); //前端傳入reqmap.put("totalAmount",map.get("totalAmount")); //訂單金額reqmap.put("notifyUrl", map.get("notifyUrl")); //支付結(jié)果通知地址reqmap.put("returnUrl", map.get("returnUrl")); //網(wǎng)頁跳轉(zhuǎn)地址//生成待簽名字符串并進(jìn)行MD5加密String builderSignStr = "";try {builderSignStr = PayUtil.builderSignStr(reqmap,UnionPayConstants.MD5KEY);//signString = PayUtil.generateSignature(reqmap, UnionPayConstants.MD5KEY);} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}reqmap.put("sign", builderSignStr);logger.info("reqmap= " + reqmap);//拼接請求URLStringBuffer url = new StringBuffer();try {url.append("https://qr-test2.chinaums.com/netpay-portal/webpay/pay.do?");url.append("requestTimestamp=" + URLEncoder.encode((String) reqmap.get("requestTimestamp"), "UTF-8") +"&mid=" + URLEncoder.encode((String) reqmap.get("mid"), "UTF-8") + "&tid="+ URLEncoder.encode((String) reqmap.get("tid"), "UTF-8") + "&instMid=" + URLEncoder.encode((String) reqmap.get("instMid"), "UTF-8") + "&msgSrc=" + URLEncoder.encode((String) reqmap.get("msgSrc"), "UTF-8") + "&merOrderId=" + URLEncoder.encode((String) reqmap.get("merOrderId"), "UTF-8") + "&totalAmount=" + URLEncoder.encode((String) reqmap.get("totalAmount"), "UTF-8") + "&msgId=" + URLEncoder.encode((String) reqmap.get("msgId"), "UTF-8") + "&msgType=" + URLEncoder.encode((String) reqmap.get("msgType"), "UTF-8") + "&originalAmount=" + URLEncoder.encode((String) reqmap.get("originalAmount"), "UTF-8") + "?ifyUrl=" + URLEncoder.encode((String) reqmap.get("notifyUrl"), "UTF-8") + "&returnUrl=" + URLEncoder.encode((String) reqmap.get("returnUrl"), "UTF-8") + "&sign=" + URLEncoder.encode((String) reqmap.get("sign"), "UTF-8"));logger.info("銀聯(lián)商務(wù)下單url = " + url);} catch (Exception e) {// TODO: handle exceptionreturn "缺少必要參數(shù),請核實(shí)后再進(jìn)行下單";}return url.toString();}

1.3 支付結(jié)果截圖
在下單接口中,我先在寫了一個支付的html頁面,用于顯示支付信息,用戶點(diǎn)擊“去支付”按鈕調(diào)起圖二支付頁面,支付完成時,用戶點(diǎn)擊“完成”按鈕,跳轉(zhuǎn)到程序中指定的returnurl地址中,支付結(jié)果通知到notifyurl地址中。
支付下單參數(shù)由銀聯(lián)商務(wù)分配的參數(shù)填入。

訪問地址:http://172.20.10.2:8080/UnionPay/lay/UnifiedPay(本地環(huán)境訪問)
支付連接為:http://172.20.10.2:8080/UnionPay/lay/UnifiedPay?mid=******&tid=******&instMid=******&msgSrc=******&payType=WXPay.jsPay&totalAmount=0.11?ifyUrl=http%3A%2F%2F******&returnUrl=http%3A%2F%2F******&sign=B2AD890DD4636C9A9AEA03F265BE695A

根據(jù)博友的需求,這里增加下銀商驗(yàn)簽部分代碼

/*** 生成 MD5** @param data* 待處理數(shù)據(jù)* @return MD5結(jié)果*/public static String MD5(String data) throws Exception {java.security.MessageDigest md = MessageDigest.getInstance("MD5");byte[] array = md.digest(data.getBytes("UTF-8"));StringBuilder sb = new StringBuilder();for (byte item : array) {sb.append(Integer.toHexString((item & 0xFF) | 0x100).substring(1, 3));}return sb.toString().toUpperCase();}/*** 生成待簽名數(shù)據(jù)* @param params* @return* @throws Exception */public static String builderSignStr(Map<String, Object> params,String md5key) throws Exception {Set<String> keySet = params.keySet();List<String>keyList = new ArrayList<String>(keySet);Collections.sort(keyList);StringBuilder sb = new StringBuilder();for (String key : keyList) {sb.append(key);sb.append("=");sb.append(params.get(key));sb.append("&");}sb.deleteCharAt(sb.length() - 1); //去掉最后一個&sb.append(md5key);logger.info("builderSignStr= " + sb.toString());logger.info("驗(yàn)證sign:" + MD5(sb.toString()).toUpperCase());return MD5(sb.toString()).toUpperCase();}

總結(jié)

以上是生活随笔為你收集整理的java对接银联商务公众号+服务窗支付(1)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 日日躁夜夜躁 | 摸摸大奶子 | 99re超碰| 午夜性激情 | 女女h百合无遮羞羞漫画软件 | 黄页免费视频 | 欧美人人爽 | 99爱视频| 成人颜色网站 | 日本aⅴ在线 | 天天躁日日躁狠狠躁av麻豆 | 日韩精品999| 国产一区毛片 | 日本少妇吞精囗交视频 | av大片在线播放 | 精品探花| av大片网址 | 国产激情福利 | av永久网站| 啪啪啪一区二区 | 人人妻人人玩人人澡人人爽 | 一起艹在线观看 | 蜜桃精品噜噜噜成人av | 日韩天堂 | 成人国产三级 | 国产无限制自拍 | 久久精品久久久精品美女 | 91视频在线免费观看 | 国产精品久久久久影院老司 | 69福利视频| 精品国产乱码久久久久久牛牛 | 久久伊人亚洲 | 少妇高潮av | 日韩成人在线免费观看 | 超碰在线最新 | 麻豆三级视频 | 在线免费观看av不卡 | 精品免费久久 | 高h视频在线免费观看 | 福利91 | 亚洲精品传媒 | 自拍偷拍第一页 | 女人脱了内裤趴开腿让男躁 | 91精品视频免费在线观看 | 老牛影视一区二区三区 | 久久婷婷视频 | 九色婷婷 | 九九九在线视频 | 美女脱得一干二净 | 精久久久久 | 国产精品一区2区 | 91精品国产综合久久久蜜臀图片 | 巨胸喷奶水www久久久免费动漫 | 日韩激情视频网站 | 欧美一区二区三区免费 | 色啦啦视频 | 91麻豆产精品久久久久久 | 国产综合久久久久 | 激情视频一区二区三区 | 日韩欧美91 | 成人涩涩网站 | 黄色成人免费网站 | 日本h视频在线观看 | 天天躁日日躁狠狠躁伊人 | 久久天天综合 | 青青草成人免费视频 | 高清av免费 | 日韩人妻一区二区三区蜜桃 | 自慰无码一区二区三区 | 丝袜视频一区 | 欧美一级淫片bbb一84 | 扒开美女内裤狂揉下部 | 欧美在线www | 波多野结衣视频网站 | 性做久久久久久久免费看 | 超碰中文字幕 | 国产亚洲精久久久久久无码苍井空 | 午夜淫片 | 国产精彩视频在线 | 欧美在线观看网站 | 天天爽天天爽天天爽 | 亚洲天堂2013 | 激情伦成人综合小说 | 欧美三级a| 欧美三级午夜理伦三级老人 | 91伦理视频 | 日韩色视频在线观看 | 中文字幕乱码亚洲精品一区 | 亚洲.www | 日韩毛片在线看 | 在线免费观看黄网站 | 人人插人人干 | 国产做爰视频免费播放 | 密色av| 国产精品久久久久久久久久久久久 | 在线观看黄网址 | 女人脱下裤子让男人捅 | 美女18网站 | 在线观看网站av |