当前位置: 首页 > 后端技术 > Java

银联支付,实现代码对接

时间:2023-04-01 17:01:10 Java

鏀粯鏁堟灉瑙佹枃鏈€傚仛杩囨敮浠樼殑鍚屽閮界煡閬擄紝鏀粯瀹濆拰寰俊鏀粯鍙€傚悎灏忛鏀粯銆傚鏋滈亣鍒伴渶瑕佸ぇ棰濇敮浠樼殑涓氬姟鍦烘櫙锛岃繕鏄瀵规帴閾惰仈鏀粯銆備笌鍏朵粬鏀粯骞冲彴涓€鏍凤紝閾惰仈涔熸牴鎹笉鍚岀殑绉诲姩缁堢鎻愪緵浜嗙浉搴旂殑鏀粯娓犻亾锛屽鍦ㄧ嚎缃戝叧鏀粯銆侀摱鑱擜PP鏀粯锛堝師鎵嬫満鏀粯鎺т欢锛夈€佷紒涓氱綉閾舵敮浠橈紙鍟嗘埛鐗堬級銆佹墜鏈虹綉椤垫敮浠橈紙WAP鏀粯锛夈€佷簩缁寸爜鏀粯绛夋帴鍏ュ钩鍙版帴鍙g殑绗竴姝ヨ嚜鐒舵槸瑕佹湁涓€涓处鍙枫€傛敞鍐岃处鍙风殑娴佺▼灏变笉澶氳浜嗐€傛偍鍙互鍦ㄥ畼鏂圭綉绔欎笂娉ㄥ唽銆?https://open.unionpay.com/)閫夋嫨闇€瑕佸鎺ョ殑浜у搧锛屽~鍐欎俊鎭紝鎻愪氦鍏ョ綉鐢宠锛屽嵆鍙繘琛屼笟鍔″鎺ャ€傞潪甯稿弸濂斤紝骞冲彴浼氭彁渚涙祴璇曞弬鏁拌皟璇曟帴鍙o紝鍦ㄤ釜浜轰腑蹇?鍟嗘埛缃戞祴璇曚腑蹇?娴嬭瘯鍙傛暟锛屽寘鎷祴璇曞晢鎴峰彿銆佹祴璇曡瘉涔︺€佹祴璇曞湴鍧€銆傛湁浜嗚繖浜涗笢瑗匡紝灏卞彲浠ュ紑濮嬪啓浠g爜鍜岃皟璇曠晫闈簡銆傚綋鐒讹紝鏈€鑸掓湇鐨勬槸骞冲彴杩樻彁渚涗簡SDK渚涘ぇ瀹跺弬鑰冦€傜粡杩囨祴璇曪紝纭疄浠呬緵鍙傝€冿紝鍥犱负涓嶈兘杩愯锛屽搱鍝堭煒€銆傝櫧鐒朵唬鐮佸緢绠€鍗曪紝浣嗘槸瑕佹垚鍔熼泦鎴愯繕鏄渶瑕佸姫鍔涚殑銆俛cp_sdk.properties閰嶇疆鏂囦欢涓昏鏀剧疆涓€浜涜瘉涔︽枃浠讹紝璇佷功鏄粠鍟嗘埛鍏ョ綉娴嬭瘯涓績涓嬭浇鐨勩€?##########################缃戠粶鎺ュ叆娴嬭瘯鐜浜ゆ槗鍙戦€佸湴鍧€################################娑堟伅鐗堟湰鍙凤紝鍥哄畾5.1.0acpsdk.version=5.1.0#绛惧悕鏂瑰紡锛岃瘉涔︽柟寮忓浐瀹?1acpsdk.signMethod=01##娴嬭瘯浜ゆ槗璇锋眰鍦板潃acpsdk銆俧rontTransUrl=https://gateway.test.95516.com/gateway/api/frontTransReq.doacpsdk.backTransUrl=https://gateway.test.95516.com/gateway/api/backTransReq.doacpsdk.singleQueryUrl=https://gateway.test.95516.com/gateway/api/queryTrans.do#鏄惁楠岃瘉楠岃瘉璇佷功鐨凜N锛屾祴璇曠幆澧冭缃负false锛岀敓浜х幆澧冭缃负true銆俛cpsdk.ifValidateCNName=false#鏄惁楠岃瘉https璇佷功锛屾祴璇曠幆澧冭缃负false锛岀敓浜х幆澧冭缃负true銆俛cpsdk.ifValidateRemoteCert=false##########################缃戠粶璁块棶娴嬭瘯鐜绛惧悕璇佷功閰嶇疆##################################绛惧悕璇佷功璺緞acpsdk.signCert.path=/data/acp_test_sign.pfx#绛惧悕璇佷功瀵嗙爜锛屾祴璇曠幆澧冨浐瀹?00000acpsdk.signCert銆俻wd=000000#绛惧悕璇佷功绫诲瀷锛宖ixed涓嶉渶瑕佷慨鏀筧cpsdk.signCert.type=PKCS12############################鍔犲瘑璇佷功閰嶇疆##################################鏁忔劅淇℃伅鍔犲瘑璇佷功璺緞acpsdk.encryptCert.path=/data/acp_test_enc.cer#########################楠岃瘉璇佷功閰嶇疆##################################绛惧悕楠岃瘉涓棿璇佷功璺緞acpsdk.middleCert.path=/data/acp_test_middle.cer#绛惧悕楠岃瘉鏍硅瘉涔﹁矾寰刟cpsdk.rootCert.path=/data/acp_test_root.cer灏哸cp_sdk.properties閰嶇疆鏂囦欢鏀惧湪鏍圭洰褰曚笅鍐欎竴涓厤缃被UnionPayConfig锛屽惎鍔ㄦ椂鍔犺浇璇佷功鍐呭@Component@Configuration@EnableConfigurationProperties({UnionProperties.class})publicclassUnionPayConfig{privateUnionPropertiesunion;publicUnionPayConfig(UnionPropertiesunion){this.union=union;SDKConfig.getConfig().loadPropertiesFromSrc();}}PC绔皟鐢ㄦ敮浠橀〉闈紝娉ㄦ剰浜ゆ槗閲戦锛屽崟浣嶄负鍒嗭紝鏃犲皬鏁扮偣锛岀粨鏋滀互琛ㄦ牸褰㈠紡鎵撳紑鏀粯椤甸潰銆侤GetMapping(value="webPay")publicvoidwebPay(HttpServletResponseresp)throwsIOException{logger.info("閾惰仈鐢佃剳鏀粯");UnionPayParamparam=newUnionPayParam();param.setOrderId(UnionConfig.getCurrentTime())銆俿etTxnTime(UnionConfig.getCurrentTime()).setTxnAmt("330000").setReqReserved(param.getOrderId());unionPayService.webPay000202(param,resp);Mapdata=newHashMap<>(29);//鐗堟湰鍙凤紝鍏ㄦ笭閬撻粯璁ゅ€糳ata.put("version",UnionConfig.version);//瀛楃闆嗙紪鐮侊紝鍙互浣跨敤UTF-8鍜孏BKdata.put("encoding",UnionConfig.encoding_UTF8);//绛惧悕鏂规硶data.put("signMethod",SDKConfig.getConfig().getSignMethod());//浜ゆ槗绫诲瀷锛?1锛氭秷璐筪ata.put("txnType","01");//浜ゆ槗瀛愮被鍨嬶紝01锛氳嚜鍔╂秷璐筪ata.put("txnSubType","01");//涓氬姟绫诲瀷000202:B2Bdata.put("bizType","000202");//鍥哄畾閫氶亾绫诲瀷07data.put("channelType","07");//鍟嗘埛缂栧彿data.put("merId",unionProperties.getMerId());//鎺ュ叆绫诲瀷锛?锛氱洿杩炲晢鎴穌ata.put("accessType","0");//鍟嗘埛璁㈠崟鍙凤紝8-40浣嶆暟瀛楀拰瀛楁瘝锛屼笉鑳藉寘鍚€?鈥濇垨鈥淿鈥濓紝鍙嚜瀹氫箟瑙勫垯data.put("orderId",param.getOrderId());//璁㈠崟鍙戦€乼ime锛屽彇绯荤粺鏃堕棿锛屾牸寮忎负YYYYMMDDhhmmss锛屽繀椤诲彇褰撳墠鏃堕棿锛屽惁鍒檛xnTime浼氭姤invalidcurrencyCode","156");//浜ゆ槗閲戦锛屽崟浣嶇偣鏁帮紝涓嶅甫灏忔暟鐐筪ata.put("txnAmt",CommonUtils.subZeroAndDot(param.getTxnAmt()));//涓氬姟鍦烘櫙锛屽弬鑰冩帴鍙h鑼冩暟鎹?put("bizScene","110001");//鏀舵浜鸿处鎴峰悕data.put("payeeAcctNm",URLEncoder.encode(unionProperties.getPayeeAcctNm(),UnionConfig.encoding_UTF8));//鏀舵浜鸿处鎴锋暟鎹?put("payeeAcctNo",unionProperties.getPayeeAcctNo());//鏀舵浜洪摱琛屽悕绉癲ata.put("payeeBankName",URLEncoder.encode(unionProperties.getPayeeBankName(),UnionConfig.encoding_UTF8));//鍓嶅彴閫氱煡鍦板潃鏁版嵁.put("frontUrl",unionProperties.getFrontUrl());//鍚庡彴閫氱煡鍦板潃data.put("backUrl",unionProperties.getBackUrl());//璁㈠崟瓒呮椂data.put("payTimeout",newSimpleDateFormat("yyyyMMddHHmmss").format(System.currentTimeMillis()+15*60*1000));//璇锋眰鑰呴鐣欏瓧娈碉紝褰撳唴瀹规病鏈夊嚭鐜?={}[]"'绛夌鍙锋椂锛屽彲浠ョ洿鎺ュ~鍐欐暟鎹甦ata.put("reqReserved",Base64.encodeBase64String(param.getReqReserved().getBytes(UnionConfig.encoding_UTF8)));MapreqData=AcpUtils.sign(data,UnionConfig.encoding_UTF8);StringrequestFrontUrl=SDKConfig.getConfig().getFrontRequestUrl();Stringhtml=AcpUtils.createAutoFormHtml(requestFrontUrl,reqData,UnionConfig.encoding_UTF8);logger.info("鎵撳嵃璇锋眰HTML锛岃繖鏄姹傛秷鎭細{}",html);resp.getWriter().write(html);鍜屽叾浠栨敮浠樻柟寮忎竴鏍凤紝鏀粯缁撴灉浠ュ紓姝ラ€氱煡鐨勬柟寮忛€氱煡寮€鍙戣€咃紝杩欓噷澶勭悊涓氬姟閫昏緫锛屾瘮濡傚皢璁㈠崟鐘舵€佹敼涓哄凡浠樻@PostMapping(value="unionPayNotify")publicvoidunionPayNotify(HttpServletRequestrequest,HttpServletResponseresponse)throwsException{logger.info("閾惰仈鎺ユ敹鍚庡彴閫氱煡寮€濮?);Stringencoding=request.getParameter(SDKConstants.param_encoding);//鑾峰彇閾惰仈閫氱煡鏈嶅姟鍣ㄥ彂閫佺殑鍚庡彴閫氱煡鍙傛暟MapreqParam=AcpUtils.getAllRequestParam(request);MapvalidData=newHashMap<>();if(!reqParam.isEmpty()){Iterator>it=reqParam.entrySet().iterator();validData=newHashMap<>(reqParam.size());while(it.hasNext()){Map.Entrye=it.next();瀛楃涓查敭=e.getKey();瀛楃涓插€?e.getValue();value=newString(value.getBytes(encoding),缂栫爜);validData.put(key,value);}}濡傛灉锛堬紒AcpUtils.validate(validData,encoding)){logger.info("閾惰仈楠岃瘉绛惧悕缁撴灉[澶辫触]銆?);}else{logger.info("閾惰仈鍥炶皟缁撴灉鍙傛暟=====:{}",JSON.toJSONString(valideData));logger.info("閾惰仈楠岃瘉绛惧悕缁撴灉[鎴愬姛]銆?);AsyncNotifyResult缁撴灉=JSON.parseObject(JSON.toJSONString(valideData),AsyncNotifyResult.class);//鍝嶅簲鐮丼tringrespCode=result.getRespCode();//鍝嶅簲淇℃伅StringrespMsg=result.getRespMsg();if(StringUtils.equals("00",respCode)&&StringUtils.equals("success[0000000]",respMsg)){//鍟嗗璁㈠崟鍙稴tringorderId=result.getOrderId();//閾惰仈鏌ヨ娴佹按鍙稴tringqueryId=result.getQueryId();//閾惰仈璁㈠崟鍙戦€佹椂闂碨tringtxnTime=result.getTxnTime();StringtxnAmt=result.getTxnAmt();//杈呭姪淇℃伅StringreqReserved=result.getReqReserved();璁板綍鍣?info("reqReserved=====:{}",newString(Base64.decodeBase64(reqReserved),UnionConfig.encoding_UTF8));//TODO//閾惰仈鏈繑鍥炴敮浠樻椂闂达紝绯荤粺鐢熸垚logger.info("澶勭悊涓氬姟閫昏緫锛宱rderId:{},updatequeryId:{},txnTime:{}=====",orderId,queryId,浜ゆ槗鏃堕棿);}response.getWriter().print("ok");}}鐪嬩竴涓婨ffect杩欐槸娴嬭瘯鐜銆傞€夋嫨鍗″彿锛岃緭鍏ラ獙璇佺爜锛岀偣鍑绘彁浜ゃ€傚鏋滄偍闇€瑕侀摱鑱旀敮浠樹唬鐮侊紝鍙互瀹炵幇浠g爜瀵规帴銆傚北姘撮棿鏈夊洟鍦嗐€備綘鍙互鏈熷緟瀹冨湪鏈潵銆傛劅璋㈡偍闃呰銆傚鑳芥帰娴凤細鏀粯瀹濆皬绋嬪簭妯℃澘寮€鍙戯紝鍏ㄥ娴佺▼