收到微信公众平台 回调url支付凭证是不是意味着回调了

第三方支付平台支付接口及回调接口开发
作为开放式的B/S架构程序,无论所属电商,金融,机械制造,企业OA,ERP,CRM,CMS等等行业或系统中,第三方支付以及银联支付的业务一定是客户关心所在,也是保证客户系统盈利运营的一个重要保障。通常这种B2C或者C2C系统的开发,商户用户所关注的支付平台大多离不开“阿里支付宝,快钱,腾讯财付通,易宝支付这种第三方支付平台以及中国银联UnionPay....等等”这些方式。
最近某项目中涉及到支付的模块与涉及流程,在此和大家分享一下。
1,名词释义
&&&&&&&商户网站:比如淘宝,聚美,唯品会这种B2C/C2C的网站及后台的管理系统,统称为商户网站;主要负责对买家订单数据的封装,加密,
&&&&&&&&&&&&&&&&&&&&&&&&及支付平台回调的订单处理。
&&&&&&&支付平台:我们需要开发的支付平台,支付接口,支付模拟的Servlet,暴露出来的WebService接口url等;主要负责对买家请求来的
&&&&&&&&&&&&&&&&&&&&&&&&加密后的订单数据进行解密,构造请求的URL,拼接参数,对Sign进行加密,对支付机构异步(或同步)请求回调的数据
&&&&&&&&&&&&&&&&&&&&&&&&进行封装,解密回传给商户网站。
&支付机构:比如阿里支付宝,快钱,腾讯财付通,易宝支付这种第三方支付平台等支付机构。
&&&Sign:支付机构为商户分配的一把“密钥”与”合作者ID“同时分配,用做调用Base64,MD5等加密算法在加密解密时的一种私钥,通常
&&&&&&&&&&&&&
&与此相关联的还有signType,就是加密方式。
&&&回调:对上次请求端request中的url或指定的url进行http请求,或https请求
&&&&&&支付平台请求,响应,及回调流程图:
2,业务流设计(本文只介绍alipay的即时到账接口:"create_direct_pay_by_user")
&&&&&&&2.1&&商户网站对数据封装加密,调用支付接口:
2.1.1)商户网站后台对买家的订单进行封装,插入商户网站db中的订单表(比如:xxx_order);
&&&&&&&&&&&&&&&&&&&&&&&&&PayReturnVovo
= new PayReturnVo();
&&&&&&&&&&&
&&&&&&&&&&&&
&vo.setOrderId("kuaiqian00232");&
&&&&&&&&&&&
&&&&&vo.setOrderAmount("20");&
&&&&&&&&&&&
&&&&&vo.setOrderTime("20");&
&&&&&&&&&&&
&&&&&vo.setProductName("3M网线,送水晶头");&
&&&&&&&&&&&
&&&&&&&&&&&&&&&
&vo.setProductId("8");&
&&&&&&&&&&&
&&&&&&&&&&&
&&&&&vo.setProductNum("2");&
&&&&&&&&&&&
&&&&&&&&&&&
&&&&&vo.setPayType("00");*/&&&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&//&&&把模拟的表单数据转成Json
&&&&&&&&&&&&&&&&&&&&&&&&&&&
StringorderJson=&PaymentJsonUtil.beanToJson(vo);
&&&&&&&&&&&&&&&&&&&&&&&&&&&
//&&&通过db获取商家key密钥
&&&&&&&&&&&&&&&&&&&&&&&&&&&
Stringkey = dao.getKeyByUserId(userId);
&&&&&&&&&&&&&&&&&&&&&&&&&&&
//&&&根据key使用base64加密算法对订单信息进行加密
StringSignedJson = CryptUtil.encryptBase64Des(orderJson,
& & 2.1.2)于此同时调用dao层查询买家用户平台账户余额,并进行锁表:在SQL的select后加入&forupdate
wait n(最好
&为1-5秒,此处的&数值为httpclient请求超时时长)为防止订单被多用户修改。
&&&&&&2.2&&支付平台响应请求及解密,调用支付机构接口:
&2.2.1)支付平台响应请求,对数据进行解密;
&&&&&&&&&&&&&&&&&&&&&&&&&&&
//获取输入参数
&&&&&&&&&&&&&&&&&&&&&&&&&&&&InputStreamis
= request.getInputStream();
&&&&&&&&&&&&&&&&&&&&&&&
&&&&//把接收的加密流转成String类型
&&&&&&&&&&&&&&&&&&&&&&&
&&&&StringpayMsgJson
= IOUtils.toString(is, "utf-8");
&&&&&&&&&&&&&&&&&&&&&&&&&&&
//base64进行解密
&&&&&&&&&&&&&&&&&&&&&&&
&&&&byte[]byteJson
= CryptUtil.decryptBASE64payMsgJson
&&&&&&&&&&&&&&&&&&&&&&&
&&&&StringstrJson
= new String(byteJson,"UTF-8");
&&&&&&&&&&&&&&&&&&&&&&&
&&&&//把解密后的json转换成实体vo
&&&&&&&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&
(BankPayVo)PaymentJsonUtil.jsonToBean(strJson,BankPayVo.class);
& &}catch (Exception e)
&&&&&&&&&&&
&&&&&&&&&&&&&e.printStackTrace();
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
throw(e);
&&&&&&&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&&&&&&
&2.2.2)从db查询商户协议信息,构造不同方式的支付机构所需请求的url;
&&&&&&&&&&&&&&&&&&&&&&&&&&&
publicString CreateUrl(PayBankEntity payBankEntity) throws
BankpayException,SQLException{ &
&&&&&&&&&&&&&&&&&&&&&&&&&
StringwebPartentId = payBankEntity.getWebPartentId();
&&&&&&&&&&&&&&&&&&&&&&&&&
//通过DB获取阿里支付Config信息
&&&&&&&&&&&&&&&&&
&&&&&&&&AliPayAccountDaoImplaccount
= new AliPayAccountDaoImpl();
&&&&&&&&&&&&&&&&&&&&&&&
&&&&&&AliPayAccountVoaccVo
account.getAccountInfo(webPartentId);&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&//根据订单号区别b2a和b2c对partner参数设置
&&&&&&&&&&&&&&&&&
&&&&&&&&StringstrOrderNo
payBankEntity.getOrderNo();&&&&&&
&&&&&&&&&&&&&&&&&&&&&&&&&
//阿里支付合作伙伴ID
&&&&&&&&&&&&&&&&&&&&&&&&&
Stringpartner =
accVo.getPaPartner();&&
&&&&&&&&&&&&&&&&&
&&&&&&&&//阿里支付key
&&&&&&&&&&&&&&&&&
&&&&&&&&Stringkey=
accVo.getPaKey();&&
&&&&&&&&&&&&&&&&&&&&&&&&&
//阿里支付接口
&&&&&&&&&&&&&&&&&
&&&&&&&&Stringpaygateway
= accVo.getPaPayGateWay();&&
&&&&&&&&&&&&&&&&&
&&&&&&&&//阿里支付服务名
&&&&&&&&&&&&&&&&&
&&&&&&&&Stringservice
= accVo.getPaService();&&
&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&&&&&&&&
//阿里支付签名Sign加密方式
&&&&&&&&&&&&&&&&&
&&&&&&&&Stringsign_type
= accVo.getPaSignType();
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
//卖家账号,邮箱
&&&&&&&&&&&&&&&&&&&&&&&&&
Stringseller_email =
accVo.getPaSellerEmail();&&&
&&&&&&&&&&&&&&&&&
&&&&&&&&//######
Form Web ######&商户网站订单
&&&&&&&&&&&&&&&&&&&&&&&&&
Stringout_trade_no =
payBankEntity.getOrderNo();&&
&&&&&&&&&&&&&&&&&&&&&&&&&
//###### Form Web ######&交易总额
&&&&&&&&&&&&&&&&&
&&&&&&&&Stringtotal_fee
= payBankEntity.getMoney();&
&&&&&&&&&&&&&&&&&&&&&&&&&&//######
######&&&商品名称
&&&&&&&&&&&&&&&&&&&&&&&&&
&&&&String
payBankEntity.getProductId();&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&&&&
&&&&//######
######&&&商品展示地址
&&&&&&&&&&&&&&&&&
&&&&&&&&StringinputCharset
accVo.getPaInputCharset();&&&&&
&&&&&&&&&&&&&&&&&
&&&&&&&&//######
Form Web ######&支付类型
&&&&&&&&&&&&&&&&&&&&&&&&&&Stringpayment_type
payBankEntity.getPaymentType();&&&
&&&&&&&&&&&&&&&&&
&&&&&&&&//超时时长
&&&&&&&&&&&&&&&&&
&&&&&&&&Stringit_b_pay
= accVo.getPaItBBay();&
&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&&&&&&&&
//!!!&在此修改参数为异步notify_url但是vo和db中显示为return_url
&&&&&&&&&&&&&&&&&
&&&&&&&&Stringreturn_url
= accVo.getPaReturnUrl();
StringItemUrl="";
&2.2.2.temp)&PS:&
下行代码的CreateUrl()是根据请求参数首字母降序排列,把参数重新构造成新的url。&
&&&&&&&&&&&&&&&&&
&&&&&&&&ItemUrl=
Payment.CreateUrl(paygateway,service,sign_type,inputCharset,payment_type,
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&
partner,key,out_trade_no,total_fee,return_url,seller_email,subject,it_b_pay);
&&&&&&&&&&&&&&&&&&&&&&&&&
System.out.println("异步通知返回agbpay地址:"+
return_url);&
&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&returnItemU
&&&&&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&&
& 2.2.3)StringBuffer绘制跳转请求的html
dom元素,把参数请求到支付机构;
&&&&&&&&&&&&&&&&&&&&&&&
publicString getBankHtml(PayBankEntity payBankEntity) throws
BankpayException {
&&&&&&&&&&&&
&&&&&&&&&&&&&StringBuffer
sbHtml = new StringBuffer();
&&&&&&&&&&&&&try
&sbHtml.append("");
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
sbHtml.append("
支付网关");
&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&sbHtml.append("
&&&&&&&&&&&&&&&&&&&&&&
&&sbHtml.append("
& }catch (Exception e) {
&&&&&&&&&&
&&&&&&&&&&&&&&&&&&&&&&&
throw new BankpayException("系统异常,错误描述:"
+ e.getMessage());
sbHtml.toString();&
&&&&&&&&&&&&&&&&&&&&&
& 2.2.4)切记不要忘记设置支付机构回调支付平台的回调url,大多数支付机构的参数为同步和异步两种,设置支付机构的
回调url目的在于它进行了我们的请求。处理之后对订单数据及订单等状态的回写,进而支付平台可以封装,
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&加密成json串,继续调用商户网站,对这次支付的信息进行更改,执行具体业务。
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&下面是阿里的api,同步和异步回调路径不能同时为空。
&&notify_url&&&&&&服务器异步通知页面路径&&&&String(160)&&&&&支付宝服务器主动通知商户网站里指定的页面Http路径&
returl_url&&&&&&服务器同步通知页面路径&&&&String(160)&&&&&支付宝完成处理后当前页面自动跳转到商户网站的Http路径&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&下面是快钱的api,同步和异步回调路径不能同时为空。
&&&&&&&&&&&&&&&&pageUrl&&&&&&接受支付结果的页面地址&&&&String(256)&&&&&需要是绝对地址,与bgUrl不能同时为空,当bgUrl为空时,生效&
&&bgUrl&&&&&&&&接受支付结果后台代码地址&&&String(256)&&&&需要是绝对地址,与pageUrl不能同时为空,当pageUrl为空时,生效&
&&&&&&2.3&&支付平台响应支付机构回调:被支付机构接收的订单支付成功或失败之后,回调我们支付平台的接口。
&&&&&&&&&&&&&&&&&&&&&&&&1)把支付宝的请求输入流转成我们需要的vo对象,调用2)中的performTask()。
&&&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&//获取输入参数
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
InputStreamis = request.getInputStream();
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
//转成String类型
&&&&&&&&&&&
&&&&&&&&&&&
&&&&&&&&String
payMsgJson =IOUtils.toString(is, "utf-8");
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
PayReturnVovos = PaymentJsonUtil.jsonToBean(payMsgJson,
PayReturnVo.class);
&&&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&request.setAttribute("returnStr",vos);
&newAliPayReturnBo().performTask(request,
response);
&&&&&&&&&&&&&&&&&&&&&&&&2)把支付宝的请求输入流转成我们需要的vo对象,调用2)中的performTask()。
&&&&&&&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&&&&&&
@SuppressWarnings("unused")
&&&&&&&&&&&&&&&&&&&&&&&
publicstatic String performTask(HttpServletRequest
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
HttpServletResponseresponse) throws IOException, ServletException
&&&&&&&&&&&&&&&&&&&&&&&
StringreturnStr = "";
&&&&&&&&&&&&&&&&&&&&&&&
StringwebPartentId = "";
&&&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
Stringsign = request.getParameter("sign");
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
//支付状态:TRADE_FINISHED(普通即时到账的交易成功状态)||TRADE_SUCCESS(开通
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&了高级即时到账或机票分销产品后的交易成功状态)
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
StringtradeStatus =
request.getParameter("trade_status");
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
//订单编号
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
StringorderNo = request.getParameter("out_trade_no");
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
//通知類型
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
Stringnotify_type = request.getParameter("notify_type");
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
//支付宝交易流水号
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
Stringtrade_no = "";
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
//订单总价
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
Stringamount = request.getParameter("total_fee");
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
if(request.getParameter("trade_no") != null) {
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
trade_no= request.getParameter("trade_no");
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
StringalipayNotifyURL = "?"
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
+"partner="
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
+"&ify_id="
&&&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
+request.getParameter("notify_id");
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
//获取支付宝ATN返回结果,true是正确的订单信息,false&是无效的
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
//StringresponseTxt = CheckURL.check(alipayNotifyURL);
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
Mapparams = new HashMap();
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
//获得POST&过来参数设置到新的params中
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
for(Iterator iter = requestParams.keySet().iterator();
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
.hasNext();){
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
Stringname = (String) iter.next();
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
String[]values = (String[]) requestParams.get(name);
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
StringvalueStr = "";
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
for(int i = 0; i & values. i++) {
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
valueStr= (i == values.length - 1) ? valueStr +
values[i]&
:valueStr + values[i] + ",";
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
params.put(name,valueStr);
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
//2、校验支付结果
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
StringpayStatus = "1";
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
Stringmysign =
com.alipay.util.SignatureHelper.sign(params,privateKey);
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
booleanverifySuccess = mysign.equalsIgnoreCase(sign);
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
//获取支付交易状态
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
booleantradeFinished = tradeStatus
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
.equalsIgnoreCase("TRADE_SUCCESS")
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
||tradeStatus.equalsIgnoreCase("TRADE_FINISHED");
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
if(verifySuccess&& tradeFinished)
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
//TODO&调用agbweb接口告知支付结果
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
PayReturnVovos = (PayReturnVo)
request.getAttribute("returnStr");
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
StringwebPartengId = vos.getWebPartentId();
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
//通过DB获取阿里支付Config信息
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
AliPayAccountDaoImplaccount = new
AliPayAccountDaoImpl();
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
AliPayAccountVoaccVo =
account.getAccountInfo(webPartengId);
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
Stringkey = accVo.getWebKey();
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
vos.setOutTradeNo(vos.getBillNo());
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
vos.setTotal_free(vos.getTotal_free());
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
vos.setPrivate_key(key);
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
StringnotifyType = vos.getNotifyType();
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
StringpayStatuss = vos.getPay_status();
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
//&&&&&&&&&支付银行
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
if(notifyType.equals("trade_status_sync")) {
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
vos.setBankName("ALIPAY");
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
vos.setBankName("QUICKMONEY");
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
//&&&&&&&&&支付结果
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
if(payStatuss.equals("TEADE_SUCCESS")||
payStatuss.equals("TEADE_FINISHED")){
&//&&&&&&&&&阿里-支付成功
&&vos.setTradeFlag("ALIPAY_T");
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
& & &returnStr=
PaymentJsonUtil.beanToJson(vos);
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
//&&&&&&&&&原封Json+key
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
StringreturnStrWithKey = key + returnS
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
StringbyteMD5 = MD5Util.MD5Encode(returnStrWithKey);
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
returnMsg(request,response, returnStr , byteMD5);
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
}else if (!verifySuccess) { // "AliPay返回的结果信息认证没有通过"
&&&&&//}else
if (false) { // "AliPay返回的结果信息认证没有通过"
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
thrownew BankpayException("Alipay支付返回失败");
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
}else { // AliPay返回没有TRADE_FINISHED
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
thrownew BankpayException("Alipay支付返回失败");
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
}catch (Exception e) {
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
e.printStackTrace();
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
return returnS
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&&&&&&3)回调商户网站的接口,告知支付状态以及回调的订单信息。
&&&&&&&&&&&&&&&&&&&&&&&
publicstatic void returnMsg(HttpServletRequest request,
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
HttpServletResponseresponse, String strMsg , String
&&&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
URLurl = new URL(
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
strMsg + "&strMD5=" + strMD5);
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
HttpURLConnectionhttp = (HttpURLConnection)
url.openConnection();
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
http.setRequestMethod("POST");
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
http.setDoOutput(true);
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
http.setDoInput(true);
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
System.setProperty("sun.net.client.defaultConnectTimeout","30000");//&连接超时30秒
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
System.setProperty("sun.net.client.defaultReadTimeout","30000");
//&读取超时30秒
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
http.connect();
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
//TODO&把数据回写到agbweb
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
OutputStreamos = http.getOutputStream();
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
//os.write(strMsg.getBytes("UTF-8"));//传入参数
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
os.flush();
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
os.close();
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
InputStreamis = http.getInputStream();
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
}catch (IOException e) {
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
e.printStackTrace();
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&throw(e);&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&&&&&&&4)被支付机构接收的订单有可能存在回调失败等情况,虽然这种情况是百万分之一的机会,但为了防止交易过程没有
&&&&&&&&&&&&&&&&&&&&&&&&&&&&进行回调,也可以通过Spring的定时任务注解:@Scheduled注解进行“对账接口”的定时对账,在此不进行详细
&&&&&&&&&&&&&&&&&&&&&&&&&&&&介绍,接口名为“Sign_trade_query”。
&2.4&&商户网站响应支付平台回调:
&&&&&&&&&&&&&&&&&&&&&&&1)流获取,转换String
&&&&&&&&&&&&&&&&&&&&&&&2)解密,Json转化为Vo;
&&&&&&&&&&&&&&&&&&&&&&&3)执行某个Service/Bo;
&&&&&&&&&&&&&&&&&&&&&&&4)更新DB,订单表等;
&&&&&&&&&&&&&&&&&&&&&&&5)回写页面,告知用户支付结果。
&&&本篇日志仅大致描述了支付宝交易的一次请求流程:
1)商户网站(订单加密)
& 2)订单解密)支付平台(构造url)
& 3)阿里接口
& 4)封装订单vo
--&支付平台 --&订单加密,模拟请求
& 5)商户网站(db操作订单)的操作流程。
其中包括其中的4次加密以及2次回调和两次模拟的http请求。其他第三方或银联支付平台与此结构大致一样,只是API中的参数或构造URL的方式,加密算法有个别差异。
&&&&&&&&仅供参考,个人觉得bo中的业务逻辑处理得还不够细致,欢迎大家提出最宝贵的意见,一起探讨学习。
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。调用接口凭证-1
EAS 发布的 webService 接口 1.1 功能规划 1、 如需调用凭证接口,必需先要登录 EAS,先期需要调用 EASLogin 登录 EAS 1.2 EASLogin 发布 1、 发布 EASLogin...
用友凭证导入工具使用说明 用友凭证导入接口工具使用说明因现有很多企业的会计人员将一些相关财务数据都以 EXCEL 格式进行存档 了,那么通过此附件即可将此部份数据直接...
EAS 发布的 webService 接口 1.1 功能规划 1、 如需调用凭证接口,必需先要登录 EAS,先期需要调用 EASLogin 登录 EAS 1.2 EASLogin 发布 1、 发布 EASLogin...
(3) 如果满足的生成凭证需要的环境要求并且操作规范正确,生成凭证还是有异常,请联系对应的支持人员进 行处理 凭证接口使用技巧 一 凭证生成 (1) 加快单据查询速度...
凭证导入接口工具实现用友系统和其他系统对接批量导入凭证数据生成凭证的步骤_计算机软件及应用_IT/计算机_专业资料。一些公司有自己的软件系统其中包含有大量的数据想要...
联系人 :张婧 电话: QQ: 北京智友信诚科技有限公司 用友软件中 t3 凭证导接口工具的使用对于一些公司企业使用我们用友 t3 产品,但是手里有大量...
使用该设置,在使用财务接口,选择‘生成凭证’时,将出现‘数据过滤’向导。 使用该设置,可在定义财务接口方案时引用该变参。 变参引用格式:[:名称] 支持函数: ...
(2)整合业务系统的业务数据到 NC 总账凭证。 业务系统和 NC 系统总账模块的...接口系统处理业务数据生成接口系统中的单据数据。 step 2. 调用 nc 服务将接口...
银联商务支付调用接口规范_计算机硬件及网络_IT/计算机_专业资料。银联商务有限...凭证号; refNo:参考号; authNo:授权码; expDate:卡片有效 期; cardNo:卡号...
参数说明 参数 access_token code 必须 是是 调用接口凭证 通过 H5 的 url 参数获取到的 CODE 说明 ? 返回结果 a)正确时返回示例如下: { &errcode&: 40029...5734人阅读
杂集(36)
java web(11)
&微信支付一个订单付款两次问题处理。
最近客户打电话说线上商城, 会员在线上商城购物偶尔会出现几个订单,存在一个订单支付两次的情况,这种问题是偶尔出现,一天出现1到2个订单,很奇怪,赶紧验证了下,不存在啊,无法重现的bug才是蛋疼的。
当时想两种可能,一是网络延迟造成回调的数据包返回超时,没有收到支付成功状态,第二种还有可能用户在支付的时候订单状态没有及时更新有问题。通常都是读代码了,开始读支付这块的代码,发下也没有任何问题啊,线上一通测试很多遍,都没有问题,难道是微信支付服务器的问题,这个应该不可能的。
开始苦逼的支付测试,忽然发现有一单的订单支付确实成功后收不到任何状态信息,这就奇怪了,开始查问题,是不是服务器拦截了微信支付的回调,忽然想到上线的后,因为受到很多恶意ip攻击,把阿里云 云盾中记录的恶意ip屏蔽
,大多恶意ip 都是出自一个网段,通过IP段方式加入阿里云安全组规则 屏蔽了。难道是微信支付服务器IP地址恰好增加了又在这个屏蔽的ip段内,赶紧调微信支付接口查看ip看下果然,增加很多微信支付的IP地址和ip段,大概是150多个ip了,这个坑终于是找到原因了,希望遇到这种问题朋友也各有好运咯。
如果公众号基于安全等考虑,需要获知微信服务器的IP地址列表,以便进行相关限制,可以通过该接口获得微信服务器IP地址列表。
接口调用请求说明
http请求方式: GET
access_token
公众号的access_token
正常情况下,微信会返回下述JSON数据包给公众号:
&ip_list&:[&127.0.0.1&,&127.0.0.1&]
微信服务器IP地址列表
错误时微信会返回错误码等信息,JSON数据包示例如下(该示例为AppID无效错误):
{&errcode&:40013,&errmsg&:&invalid appid&}
access_token是公众号的全局唯一票据,公众号调用各接口时都需使用access_token。开发者需要进行妥善保存。access_token的存储至少要保留512个字符空间。access_token的有效期目前为2个小时,需定时刷新,重复获取将导致上次获取的access_token失效。
公众平台的API调用所需的access_token的使用及生成方式说明:
1、为了保密appsecrect,第三方需要一个access_token获取和刷新的中控服务器。而其他业务逻辑服务器所使用的access_token均来自于该中控服务器,不应该各自去刷新,否则会造成access_token覆盖而影响业务;
2、目前access_token的有效期通过返回的expire_in来传达,目前是7200秒之内的值。中控服务器需要根据这个有效时间提前去刷新新access_token。在刷新过程中,中控服务器对外输出的依然是老access_token,此时公众平台后台会保证在刷新短时间内,新老access_token都可用,这保证了第三方业务的平滑过渡;
3、access_token的有效时间可能会在未来有调整,所以中控服务器不仅需要内部定时主动刷新,还需要提供被动刷新access_token的接口,这样便于业务服务器在API调用获知access_token已超时的情况下,可以触发access_token的刷新流程。
如果第三方不使用中控服务器,而是选择各个业务逻辑点各自去刷新access_token,那么就可能会产生冲突,导致服务不稳定。
公众号可以使用AppID和AppSecret调用本接口来获取access_token。AppID和AppSecret可在微信公众平台官网-开发者中心页中获得(需要已经成为开发者,且帐号没有异常状态)。注意调用所有微信接口时均需使用https协议。
接口调用请求说明
http请求方式: GET
grant_type
获取access_token填写client_credential
第三方用户唯一凭证
第三方用户唯一凭证密钥,即appsecret
正常情况下,微信会返回下述JSON数据包给公众号:
{&access_token&:&ACCESS_TOKEN&,&expires_in&:7200}
access_token
获取到的凭证
expires_in
凭证有效时间,单位:秒
错误时微信会返回错误码等信息,JSON数据包示例如下(该示例为AppID无效错误):
{&errcode&:40013,&errmsg&:&invalid appid&}
公众号可以使用AppID和AppSecret调用本接口来获取access_token。AppID和AppSecret可在微信公众平台官网-开发者中心页中获得(需要已经成为开发者,且帐号没有异常状态)。注意调用所有微信接口时均需使用https协议。
接口调用请求说明
http请求方式: GET
grant_type
获取access_token填写client_credential
第三方用户唯一凭证
第三方用户唯一凭证密钥,即appsecret
正常情况下,微信会返回下述JSON数据包给公众号:
{&access_token&:&ACCESS_TOKEN&,&expires_in&:7200}
access_token
获取到的凭证
expires_in
凭证有效时间,单位:秒
错误时微信会返回错误码等信息,JSON数据包示例如下(该示例为AppID无效错误):
{&errcode&:40013,&errmsg&:&invalid appid&}
正常情况下,微信会返回下述JSON数据包给公众号:
&ip_list&: [
&101.226.62.77&,
&101.226.62.78&,
&101.226.62.79&,
&101.226.62.80&,
&101.226.62.81&,
&101.226.62.82&,
&101.226.62.83&,
&101.226.62.84&,
&101.226.62.85&,
&101.226.62.86&,
&101.226.103.59&,
&101.226.103.60&,
&101.226.103.61&,
&101.226.103.62&,
&101.226.103.63&,
&101.226.103.69&,
&101.226.103.70&,
&101.226.103.71&,
&101.226.103.72&,
&101.226.103.73&,
&140.207.54.73&,
&140.207.54.74&,
&140.207.54.75&,
&140.207.54.76&,
&140.207.54.77&,
&140.207.54.78&,
&140.207.54.79&,
&140.207.54.80&
现在最新微信支付服务器IP地址
&&&&&ip_list&:&[
&&&&&&&&&101.226.62.77&,
&&&&&&&&&101.226.62.78&,
&&&&&&&&&101.226.62.79&,
&&&&&&&&&101.226.62.80&,
&&&&&&&&&101.226.62.81&,
&&&&&&&&&101.226.62.82&,
&&&&&&&&&101.226.62.83&,
&&&&&&&&&101.226.62.84&,
&&&&&&&&&101.226.62.85&,
&&&&&&&&&101.226.62.86&,
&&&&&&&&&101.226.103.59&,
&&&&&&&&&101.226.103.60&,
&&&&&&&&&101.226.103.61&,
&&&&&&&&&101.226.103.62&,
&&&&&&&&&101.226.103.63&,
&&&&&&&&&101.226.103.69&,
&&&&&&&&&101.226.103.70&,
&&&&&&&&&101.226.103.71&,
&&&&&&&&&101.226.103.72&,
&&&&&&&&&101.226.103.73&,
&&&&&&&&&140.207.54.73&,
&&&&&&&&&140.207.54.74&,
&&&&&&&&&140.207.54.75&,
&&&&&&&&&140.207.54.76&,
&&&&&&&&&140.207.54.77&,
&&&&&&&&&140.207.54.78&,
&&&&&&&&&140.207.54.79&,
&&&&&&&&&140.207.54.80&,
&&&&&&&&&182.254.11.203&,
&&&&&&&&&182.254.11.202&,
&&&&&&&&&182.254.11.201&,
&&&&&&&&&182.254.11.200&,
&&&&&&&&&182.254.11.199&,
&&&&&&&&&182.254.11.198&,
&&&&&&&&&59.37.97.100&,
&&&&&&&&&59.37.97.101&,
&&&&&&&&&59.37.97.102&,
&&&&&&&&&59.37.97.103&,
&&&&&&&&&59.37.97.104&,
&&&&&&&&&59.37.97.105&,
&&&&&&&&&59.37.97.106&,
&&&&&&&&&59.37.97.107&,
&&&&&&&&&59.37.97.108&,
&&&&&&&&&59.37.97.109&,
&&&&&&&&&59.37.97.110&,
&&&&&&&&&59.37.97.111&,
&&&&&&&&&59.37.97.112&,
&&&&&&&&&59.37.97.113&,
&&&&&&&&&59.37.97.114&,
&&&&&&&&&59.37.97.115&,
&&&&&&&&&59.37.97.116&,
&&&&&&&&&59.37.97.117&,
&&&&&&&&&59.37.97.118&,
&&&&&&&&&112.90.78.158&,
&&&&&&&&&112.90.78.159&,
&&&&&&&&&112.90.78.160&,
&&&&&&&&&112.90.78.161&,
&&&&&&&&&112.90.78.162&,
&&&&&&&&&112.90.78.163&,
&&&&&&&&&112.90.78.164&,
&&&&&&&&&112.90.78.165&,
&&&&&&&&&112.90.78.166&,
&&&&&&&&&112.90.78.167&,
&&&&&&&&&140.207.54.19&,
&&&&&&&&&140.207.54.76&,
&&&&&&&&&140.207.54.77&,
&&&&&&&&&140.207.54.78&,
&&&&&&&&&140.207.54.79&,
&&&&&&&&&140.207.54.80&,
&&&&&&&&&180.163.15.149&,
&&&&&&&&&180.163.15.151&,
&&&&&&&&&180.163.15.152&,
&&&&&&&&&180.163.15.153&,
&&&&&&&&&180.163.15.154&,
&&&&&&&&&180.163.15.155&,
&&&&&&&&&180.163.15.156&,
&&&&&&&&&180.163.15.157&,
&&&&&&&&&180.163.15.158&,
&&&&&&&&&180.163.15.159&,
&&&&&&&&&180.163.15.160&,
&&&&&&&&&180.163.15.161&,
&&&&&&&&&180.163.15.162&,
&&&&&&&&&180.163.15.163&,
&&&&&&&&&180.163.15.164&,
&&&&&&&&&180.163.15.165&,
&&&&&&&&&180.163.15.166&,
&&&&&&&&&180.163.15.167&,
&&&&&&&&&180.163.15.168&,
&&&&&&&&&180.163.15.169&,
&&&&&&&&&180.163.15.170&,
&&&&&&&&&101.226.103.0/25&,
&&&&&&&&&101.226.233.128/25&,
&&&&&&&&&58.247.206.128/25&,
&&&&&&&&&182.254.86.128/25&,
&&&&&&&&&103.7.30.21&,
&&&&&&&&&103.7.30.64/26&,
&&&&&&&&&58.251.80.32/27&,
&&&&&&&&&183.3.234.32/27&,
&&&&&&&&&121.51.130.64/27&
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:132837次
积分:1798
积分:1798
排名:千里之外
原创:45篇
转载:58篇
评论:15条
(2)(2)(1)(1)(2)(4)(5)(2)(2)(4)(8)(4)(2)(3)(6)(1)(1)(4)(2)(1)(2)(3)(3)(1)(4)(2)(1)(5)(16)(6)(4)
(window.slotbydup = window.slotbydup || []).push({
id: '4740881',
container: s,
size: '200,200',
display: 'inlay-fix'}

我要回帖

更多关于 微信公众平台 回调url 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信