生活随笔
收集整理的這篇文章主要介紹了
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
;@RequestMapping(value
= "/UnifiedPay", method
= RequestMethod
.GET
)public String
unionpay(HttpServletRequest request
, HttpServletResponse response
,Map resultdatamap
) throws UnsupportedEncodingException
{Map datamap
= new HashMap(); String key
= UnionPayConstants
.GGMD5KEY
; logger
.info("getQueryString:" + request
.getQueryString()); String 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");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
);try {if (!PayUtil
.verifySign(datamap
,key
,sign
)) {resultdatamap
.put("returnInfo", "簽名錯誤");resultdatamap
.put("returnCode", "Bad_Sign");return "failure"; }if(!PayUtil
.verifyParameter(datamap
)) {resultdatamap
.put("returnCode", "Common_Value_Error");resultdatamap
.put("returnInfo", "缺少必要公共參數(shù)");return "failure";}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
) {e
.printStackTrace();resultdatamap
.put("returnCode", "System_Error");resultdatamap
.put("returnInfo", "系統(tǒng)異常");return "failure";}resultdatamap
.put("mid", mid
); resultdatamap
.put("tid", tid
); resultdatamap
.put("instMid", instMid
); resultdatamap
.put("msgSrc", msgSrc
); resultdatamap
.put("totalAmount", totalAmount
); resultdatamap
.put("msgType", payType
); resultdatamap
.put("notifyUrl", notifyUrl
); resultdatamap
.put("returnUrl", returnUrl
); resultdatamap
.put("merOrderId", unionpayserviceimpl
.CreateOrderID()); logger
.info("resultdatamap = " + resultdatamap
);if(resultdatamap
.get("msgType").equals("WXPay.jsPay")) { return "wxunionpay";}else {return "aliunionpay"; }}@RequestMapping(value
= "/failure", method
= RequestMethod
.GET
)public String
failure(HttpServletRequest request
, HttpServletResponse response
,String returnCode
,Map map
) {map
.put("returnCode", returnCode
); return "failure"; }@RequestMapping(value
= "/unifiedpay", method
= RequestMethod
.GET
)public String
index(HttpServletRequest request
, HttpServletResponse response
, Map map
) {Map reqmap
= new HashMap();logger
.info("unifiedpay getQueryString:" + request
.getQueryString()); String 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
); 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
);} catch (UnsupportedEncodingException e
) {e
.printStackTrace();}
return "redirect:" + url
; }}
1.2.2 UnionpayServiceimpl代碼
本部分代碼為銀聯(lián)商務(wù)支付下單接口服務(wù)。
@Overridepublic String
UnifiedOrder(Map map
) throws UnsupportedEncodingException
{Map reqmap
= new HashMap(); reqmap
.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("merOrderId", map
.get("merOrderId"));reqmap
.put("originalAmount", map
.get("totalAmount")); reqmap
.put("totalAmount",map
.get("totalAmount")); reqmap
.put("notifyUrl", map
.get("notifyUrl")); reqmap
.put("returnUrl", map
.get("returnUrl")); String builderSignStr
= "";try {builderSignStr
= PayUtil
.builderSignStr(reqmap
,UnionPayConstants
.MD5KEY
);} catch (Exception e
) {e
.printStackTrace();}reqmap
.put("sign", builderSignStr
);logger
.info("reqmap= " + reqmap
);StringBuffer 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
) {return "缺少必要參數(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)簽部分代碼
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();}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)容還不錯,歡迎將生活随笔推薦給好友。