支付异步请求跳转页面回调成功,页面跳转问题

安全检查中...
请打开浏览器的javascript,然后刷新浏览器
< 浏览器安全检查中...
还剩 5 秒&php支付宝手机网站支付,异步回调和同步回调里面应该怎么写?_php吧_百度贴吧
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&签到排名:今日本吧第个签到,本吧因你更精彩,明天继续来努力!
本吧签到人数:0成为超级会员,使用一键签到本月漏签0次!成为超级会员,赠送8张补签卡连续签到:天&&累计签到:天超级会员单次开通12个月以上,赠送连续签到卡3张
关注:137,932贴子:
php支付宝手机网站支付,异步回调和同步回调里面应该怎么写?收藏
这几天要开发支付功能,用的是新版alipay.trade.wap.pay接口,看了一下支付宝文档,发现回调分为同步和异步返回,分别返回参数到设置的return_url和notify_url地址。官方DEMO的notify_url解释要写的判断逻辑://判断该笔订单是否在商户网站中已经做过处理//如果没有做过处理,根据订单号(out_trade_no)在商户网站的订单系统中查到该笔订单的详细,并执行商户的业务程序//请务必判断请求时的total_fee、seller_id与通知时获取的total_fee、seller_id为一致的//如果有做过处理,不执行商户的业务程序官方DEMO的return_url中:则没提示要的写任何判断逻辑问题是:有两种返回方式,我不知道哪种执行再前,哪种在后。1.return_url中先查询订单状态,在将数据库订单状态更新为已付款。这样return_url和notify_url的逻辑是一模一样的了。2.return_url中直接在将数据库订单状态更新为已付款3.return_url中不做任何更改数据库操作,就由notify_url来做这三种处理哪种才正确?因为不知道同步回调和异步回调的先后顺序,不知道要不要在同步回调的return_ur中写哪种处理
0元预约!「忠于体验 打磨颜值」魅蓝 6即将火热上市!
我之前做的是notify url 异步完成支付逻辑处理 然后return url 直接查询notify 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.首先我们先下载微信支付的服务器端demo
2.个文件作用介绍
index.jsp &下单 &payRequest.jsp &获取微信支付prepay_id等。
重点我说说这个payNotifyUrl.jsp
&%@ page language=&java& contentType=&text/ charset=GBK& pageEncoding=&GBK&%&
&%@ page import=&com.tenpay.RequestHandler& %&
&%@ page import=&com.tenpay.ResponseHandler& %&
&%@ page import=&com.tenpay.client.ClientResponseHandler& %&
&%@ page import=&com.tenpay.client.TenpayHttpClient& %&
&!DOCTYPE html PUBLIC &-//W3C//DTD HTML 4.01 Transitional//EN& &http://www.w3.org/TR/html4/loose.dtd&&
//---------------------------------------------------------
//财付通支付通知(后台通知)示例,商户按照此文档进行开发即可
//---------------------------------------------------------
String partner = &&;
String key = &53e9cf7b0519d&;
//创建支付应答对象
ResponseHandler resHandler = new ResponseHandler(request, response);
resHandler.setKey(key);
//判断签名
if(resHandler.isTenpaySign()) {
String notify_id = resHandler.getParameter(&notify_id&);
//创建请求对象
RequestHandler queryReq = new RequestHandler(null, null);
//通信对象
TenpayHttpClient httpClient = new TenpayHttpClient();
//应答对象
ClientResponseHandler queryRes = new ClientResponseHandler();
//通过通知ID查询,确保通知来至财付通
queryReq.init();
queryReq.setKey(key);
queryReq.setGateUrl(&/gateway/verifynotifyid.xml&);
queryReq.setParameter(&partner&, partner);
queryReq.setParameter(&notify_id&, notify_id);
//通信对象
httpClient.setTimeOut(5);
//设置请求内容
httpClient.setReqContent(queryReq.getRequestURL());
System.out.println(&queryReq:& + queryReq.getRequestURL());
//后台调用
if(httpClient.call()) {
//设置结果参数
queryRes.setContent(httpClient.getResContent());
System.out.println(&queryRes:& + httpClient.getResContent());
queryRes.setKey(key);
//获取返回参数
String retcode = queryRes.getParameter(&retcode&);
String trade_state = queryRes.getParameter(&trade_state&);
String trade_mode = queryRes.getParameter(&trade_mode&);
//判断签名及结果
if(queryRes.isTenpaySign()&& &0&.equals(retcode) && &0&.equals(trade_state) && &1&.equals(trade_mode)) {
System.out.println(&订单查询成功&);
//取结果参数做业务处理
System.out.println(&out_trade_no:& + queryRes.getParameter(&out_trade_no&)+
& transaction_id:& + queryRes.getParameter(&transaction_id&));
System.out.println(&trade_state:& + queryRes.getParameter(&trade_state&)+
& total_fee:& + queryRes.getParameter(&total_fee&));
//如果有使用折扣券,discount有值,total_fee+discount=原请求的total_fee
System.out.println(&discount:& + queryRes.getParameter(&discount&)+
& time_end:& + queryRes.getParameter(&time_end&));
//------------------------------
//处理业务开始
//------------------------------
//处理数据库逻辑
//注意交易单不要重复处理
//注意判断返回金额
//------------------------------
//处理业务完毕
//------------------------------
resHandler.sendToCFT(&Success&);
//错误时,返回结果未签名,记录retcode、retmsg看失败详情。
System.out.println(&查询验证签名失败或业务错误&);
System.out.println(&retcode:& + queryRes.getParameter(&retcode&)+
& retmsg:& + queryRes.getParameter(&retmsg&));
System.out.println(&后台调用通信失败&);
System.out.println(httpClient.getResponseCode());
System.out.println(httpClient.getErrInfo());
//有可能因为网络原因,请求已经处理,但未收到应答。
System.out.println(&通知签名验证失败&);
就是上面的这代码。完全没有用。查看sdk源码才知道 这个异步回调是接收微信发送的所有参数,然后排序 &加密 验签。 &最坑的是 &微信 的参数根本不是通过的参数返回的。而是通过的流。所以这个太坑了。下面我把我修改过的源码发出来 帮助大家解决回调问题。
首先是控制器
* 异步回调接口
* @param request
* @param response
* @throws Exception
@RequestMapping(value=&/weixin_parent_notify.do&,produces=&text/charset=utf-8&)
@ResponseBody
public String WeixinParentNotifyPage(HttpServletRequest request,HttpServletResponse response) throws Exception{
ServletInputStream instream = request.getInputStream();
StringBuffer sb = new StringBuffer();
int len = -1;
byte[] buffer = new byte[1024];
while((len = instream.read(buffer)) != -1){
sb.append(new String(buffer,0,len));
instream.close();
SortedMap&String,String& map = WXRequestUtil.doXMLParseWithSorted(sb.toString());//接受微信的通知参数
Map&String,String& return_data = new HashMap&String,String&();
//创建支付应答对象
ResponseHandler resHandler = new ResponseHandler(request, response);
resHandler.setAllparamenters(map);
resHandler.setKey(ConstantUtil.PARTNER_KEY[0]);
//判断签名
if(resHandler.isTenpaySign()){
if(!map.get(&return_code&).toString().equals(&SUCCESS&)){
return_data.put(&return_code&, &FAIL&);
return_data.put(&return_msg&, &return_code不正确&);
if(!map.get(&result_code&).toString().equals(&SUCCESS&)){
return_data.put(&return_code&, &FAIL&);
return_data.put(&return_msg&, &result_code不正确&);
String out_trade_no = map.get(&out_trade_no&).toString();
String time_end = map.get(&time_end&).toString();
BigDecimal total_fee = new BigDecimal(map.get(&total_fee&).toString());
//付款完成后,支付宝系统发送该交易状态通知
System.out.println(&交易成功&);
Map order = orderdao.PaymentEndGetOrderInfo(out_trade_no);
if(order == null){
System.out.println(&订单不存在&);
return_data.put(&return_code&, &FAIL&);
return_data.put(&return_msg&, &订单不存在&);
return WXRequestUtil.GetMapToXML(return_data);
int order_type = (int) order.get(&order_type&);
boolean payment_status = (boolean) order.get(&payment_status&);
int supplier_id = (int) order.get(&supplier_id&);
BigDecimal p = new BigDecimal(&100&);
BigDecimal amount = (BigDecimal) order.get(&amount&);
= amount.multiply(p);
//如果订单已经支付返回错误
if(payment_status){
System.out.println(&订单已经支付&);
return_data.put(&return_code&, &SUCCESS&);
return_data.put(&return_msg&, &OK&);
return WXRequestUtil.GetMapToXML(return_data);
//如果支付金额不等于订单金额返回错误
pareTo(total_fee)!=0){
System.out.println(&资金异常&);
return_data.put(&return_code&, &FAIL&);
return_data.put(&return_msg&, &金额异常&);
return WXRequestUtil.GetMapToXML(return_data);
//更新订单信息
if(orderdao.PaymentEndUpdateOrder(out_trade_no, time_end)){
System.out.println(&更新订单成功&);
//如果该订单是幼儿产品
并且 存在代理
if(order_type == 2){
if(supplier_id != 0){
Map su = userdao.getSupplierInfo(supplier_id);
String phone = (String) su.get(&phone_number&);
String nickname = (String) su.get(&nickname&);
String app_token = (String) su.get(&app_token&);
String content = &【三盛科创】尊敬的&+ nickname +&您好。您在我们平台出售的商品有新用户下单。请您点击该链接查看发货信息。&+Config.WEB_SERVER+&/order/SupplierOrderInfo.do?order_number=&+out_trade_no+&&sid=&+app_token+&.请您务必妥善包管。&;
MessageUtil.SendMessage(phone,content);
orderdao.UpdateOrderStatus(out_trade_no, 3);//更新订单为已完成
return_data.put(&return_code&, &SUCCESS&);
return_data.put(&return_msg&, &OK&);
return WXRequestUtil.GetMapToXML(return_data);
return_data.put(&return_code&, &FAIL&);
return_data.put(&return_msg&, &更新订单失败&);
return WXRequestUtil.GetMapToXML(return_data);
return_data.put(&return_code&, &FAIL&);
return_data.put(&return_msg&, &签名错误&);
String xml = WXRequestUtil.GetMapToXML(return_data);
微信工具类WXRequestUtil.java
package com.tenpay.
import java.io.BufferedR
import java.io.ByteArrayInputS
import java.io.F
import java.io.FileInputS
import java.io.InputS
import java.io.InputStreamR
import java.io.OutputS
import java.net.ConnectE
import java.net.HttpURLC
import java.net.InetA
import java.net.URL;
import java.security.KeyS
import java.util.D
import java.util.HashM
import java.util.I
import java.util.L
import java.util.M
import java.util.SortedM
import java.util.TreeM
import javax.net.ssl.SSLC
import org.apache.http.C
import org.apache.http.HttpE
import org.apache.http.client.methods.CloseableHttpR
import org.apache.http.client.methods.HttpP
import org.apache.http.conn.ssl.SSLConnectionSocketF
import org.apache.http.conn.ssl.SSLC
import org.apache.http.entity.StringE
import org.apache.http.impl.client.CloseableHttpC
import org.apache.http.impl.client.HttpC
import org.apache.http.util.EntityU
import org.glassfish.jersey.internal.util.Base64;
import org.jdom.D
import org.jdom.E
import org.jdom.input.SAXB
import com.zhiweism.util.MD5;
import com.zhiweism.util.U
* 用户发起统一下单请求
* 作者:董志平
* 用于发起微信扫码支付接口
public class WXRequestUtil {
private static String WXSign =
public static void main(String[] args) {
//Map&String,String& res = SendPayment(&苹果&,&25&,1,0);
* 发起支付请求
* body 商品描述
* out_trade_no 订单号
* total_fee 订单金额
* product_id 商品ID
public static Map&String,String& SendPayment(String body,String out_trade_no,double total_fee,int app_type){
String url = &https://api.mch./pay/unifiedorder&;
String xml = WXParamGenerate(body,out_trade_no,total_fee,app_type);
String res = httpsRequest(url,&POST&,xml);
Map&String,String& data =
data = doXMLParse(res);
} catch (Exception e) {
* 获取签名
public static String getWXSign() {
return WXS
获得随机字符串
public static String NonceStr(){
String res = Base64.encodeAsString(Math.random()+&::&+new Date().toString()).substring(0, 30);
* 获取时间戳
public static String GetTimeStamp(){
int t = (int)(System.currentTimeMillis()/1000);
return t+&&;
获取用户的ip
public static String GetIp() {
InetAddress ia=
ia=InetAddress.getLocalHost();
String localip=ia.getHostAddress();
} catch (Exception e) {
* 获取签名
public static String GetSign(Map&String,String& param,int app_type){
String StringA =
Util.formatUrlMap(param, false, false);
String stringSignTemp = MD5.md5(StringA+&&key=&+ConstantUtil.PARTNER_KEY[app_type]).toUpperCase();
return stringSignT
* Map转xml数据
public static String GetMapToXML(Map&String,String& param){
StringBuffer sb = new StringBuffer();
sb.append(&&xml&&);
for (Map.Entry&String,String& entry : param.entrySet()) {
sb.append(&&&+ entry.getKey() +&&&);
sb.append(entry.getValue());
sb.append(&&/&+ entry.getKey() +&&&);
sb.append(&&/xml&&);
return sb.toString();
//微信统一下单参数设置
public static String WXParamGenerate(String description,String out_trade_no,double total_fee,int app_type){
int fee = (int)(total_fee * 100.00);
Map&String,String& param = new HashMap&String,String&();
param.put(&appid&, ConstantUtil.APP_ID[app_type]);
param.put(&mch_id&, ConstantUtil.PARTNER[app_type]);
param.put(&nonce_str&,NonceStr());
param.put(&body&,description);
param.put(&out_trade_no&,out_trade_no);
param.put(&total_fee&, fee+&&);
param.put(&spbill_create_ip&, GetIp());
param.put(&notify_url&, ConstantUtil.WEIXIN_NOTIFY[app_type]);
param.put(&trade_type&, &APP&);
WXSign = GetSign(param,app_type);
param.put(&sign&, WXSign);
return GetMapToXML(param);
//发起微信支付请求
public static String httpsRequest(String requestUrl, String requestMethod, String outputStr) {
URL url = new URL(requestUrl);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setDoOutput(true);
conn.setDoInput(true);
conn.setUseCaches(false);
// 设置请求方式(GET/POST)
conn.setRequestMethod(requestMethod);
conn.setRequestProperty(&content-type&, &application/x-www-form-urlencoded&);
// 当outputStr不为null时向输出流写数据
if (null != outputStr) {
OutputStream outputStream = conn.getOutputStream();
// 注意编码格式
outputStream.write(outputStr.getBytes(&UTF-8&));
outputStream.close();
// 从输入流读取返回内容
InputStream inputStream = conn.getInputStream();
InputStreamReader inputStreamReader = new InputStreamReader(inputStream, &utf-8&);
BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
String str =
StringBuffer buffer = new StringBuffer();
while ((str = bufferedReader.readLine()) != null) {
buffer.append(str);
// 释放资源
bufferedReader.close();
inputStreamReader.close();
inputStream.close();
inputStream =
conn.disconnect();
return buffer.toString();
} catch (ConnectException ce) {
System.out.println(&连接超时:{}&+ ce);
} catch (Exception e) {
System.out.println(&https请求异常:{}&+ e);
//退款的请求方法
public static String httpsRequest2(String requestMethod, String outputStr) throws Exception {
KeyStore keyStore
= KeyStore.getInstance(&PKCS12&);
StringBuilder res = new StringBuilder(&&);
FileInputStream instream = new FileInputStream(new File(&/home/apiclient_cert.p12&));
keyStore.load(instream, &&.toCharArray());
} finally {
instream.close();
// Trust own CA and all self-signed certs
SSLContext sslcontext = SSLContexts.custom()
.loadKeyMaterial(keyStore, &&.toCharArray())
SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(
sslcontext,
new String[] { &TLSv1& },
SSLConnectionSocketFactory.BROWSER_COMPATIBLE_HOSTNAME_VERIFIER);
CloseableHttpClient httpclient = HttpClients.custom()
.setSSLSocketFactory(sslsf)
HttpPost httpost = new HttpPost(&https://api.mch./secapi/pay/refund&);
httpost.addHeader(&Connection&, &keep-alive&);
httpost.addHeader(&Accept&, &*/*&);
httpost.addHeader(&Content-Type&, &application/x-www-form- charset=UTF-8&);
httpost.addHeader(&Host&, &api.mch.&);
httpost.addHeader(&X-Requested-With&, &XMLHttpRequest&);
httpost.addHeader(&Cache-Control&, &max-age=0&);
httpost.addHeader(&User-Agent&, &Mozilla/4.0 ( MSIE 8.0; Windows NT 6.0) &);
StringEntity entity2 = new StringEntity(outputStr ,Consts.UTF_8);
httpost.setEntity(entity2);
System.out.println(&executing request& + httpost.getRequestLine());
CloseableHttpResponse response = httpclient.execute(httpost);
HttpEntity entity = response.getEntity();
System.out.println(&----------------------------------------&);
System.out.println(response.getStatusLine());
if (entity != null) {
System.out.println(&Response content length: & + entity.getContentLength());
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(entity.getContent()));
String text = &&;
res.append(text);
while ((text = bufferedReader.readLine()) != null) {
res.append(text);
System.out.println(text);
EntityUtils.consume(entity);
} finally {
response.close();
} finally {
httpclient.close();
res.toString();
public static Map&String, String& doXMLParse(String strxml) throws Exception {
strxml = strxml.replaceFirst(&encoding=\&.*\&&, &encoding=\&UTF-8\&&);
if(null == strxml || &&.equals(strxml)) {
Map&String,String& m = new HashMap&String,String&();
InputStream in = new ByteArrayInputStream(strxml.getBytes(&UTF-8&));
SAXBuilder builder = new SAXBuilder();
Document doc = builder.build(in);
Element root = doc.getRootElement();
List list = root.getChildren();
Iterator it = list.iterator();
while(it.hasNext()) {
Element e = (Element) it.next();
String k = e.getName();
String v = &&;
List children = e.getChildren();
if(children.isEmpty()) {
v = e.getTextNormalize();
v = getChildrenText(children);
m.put(k, v);
in.close();
public static SortedMap&String, String& doXMLParseWithSorted(String strxml) throws Exception {
strxml = strxml.replaceFirst(&encoding=\&.*\&&, &encoding=\&UTF-8\&&);
if(null == strxml || &&.equals(strxml)) {
SortedMap&String,String& m = new TreeMap&String,String&();
InputStream in = new ByteArrayInputStream(strxml.getBytes(&UTF-8&));
SAXBuilder builder = new SAXBuilder();
Document doc = builder.build(in);
Element root = doc.getRootElement();
List list = root.getChildren();
Iterator it = list.iterator();
while(it.hasNext()) {
Element e = (Element) it.next();
String k = e.getName();
String v = &&;
List children = e.getChildren();
if(children.isEmpty()) {
v = e.getTextNormalize();
v = getChildrenText(children);
m.put(k, v);
in.close();
public static String getChildrenText(List children) {
StringBuffer sb = new StringBuffer();
if(!children.isEmpty()) {
Iterator it = children.iterator();
while(it.hasNext()) {
Element e = (Element) it.next();
String name = e.getName();
String value = e.getTextNormalize();
List list = e.getChildren();
sb.append(&&& + name + &&&);
if(!list.isEmpty()) {
sb.append(getChildrenText(list));
sb.append(value);
sb.append(&&/& + name + &&&);
return sb.toString();
修改微信ResponseHandler.java
package com.
import java.io.IOE
import java.io.PrintW
import java.io.UnsupportedEncodingE
import java.util.I
import java.util.M
import java.util.S
import java.util.SortedM
import java.util.TreeM
import javax.servlet.http.HttpServletR
import javax.servlet.http.HttpServletR
import com.tenpay.util.MD5U
import com.tenpay.util.TenpayU
* @author miklchen
public class ResponseHandler {
private SortedM
private String debugI
private HttpServletR
private HttpServletR
private String uriE
* @param request
* @param response
public ResponseHandler(HttpServletRequest request,
HttpServletResponse response)
this.request =
this.response =
this.key = &&;
this.parameters = new TreeMap();
this.debugInfo = &&;
this.uriEncoding = &&;
public String getKey() {
public void setKey(String key) {
this.key =
* @param parameter
* @return String
public String getParameter(String parameter) {
String s = (String)this.parameters.get(parameter);
return (null == s) ? && :
* @param parameter
* @param parameterValue?
public void setParameter(String parameter, String parameterValue) {
String v = &&;
if(null != parameterValue) {
v = parameterValue.trim();
this.parameters.put(parameter, v);
* @return SortedMap
public SortedMap getAllParameters() {
return this.
public void setAllparamenters(SortedMap map){
this.parameters =
* 微信异步回调签名
* @return boolean
public boolean isTenpaySign() {
StringBuffer sb = new StringBuffer();
Set es = this.parameters.entrySet();
Iterator it = es.iterator();
while(it.hasNext()) {
Map.Entry entry = (Map.Entry)it.next();
String k = (String)entry.getKey();
String v = (String)entry.getValue();
if(!&sign&.equals(k) && null != v && !&&.equals(v)) {
sb.append(k + &=& + v + &&&);
sb.append(&key=&+this.getKey());
String enc = TenpayUtil.getCharacterEncoding(this.request, this.response);
String sign = MD5Util.MD5Encode(sb.toString(), enc).toLowerCase();
String tenpaySign = this.getParameter(&sign&).toLowerCase();
System.out.println(&sign:&+sign+&
tenpaysign:&+tenpaySign);
return tenpaySign.equals(sign);
* @throws IOException
public void sendToCFT(String msg) throws IOException {
String strHtml =
PrintWriter out = this.getHttpServletResponse().getWriter();
out.println(strHtml);
out.flush();
out.close();
* @return String
public String getUriEncoding() {
return uriE
* @param uriEncoding
* @throws UnsupportedEncodingException
public void setUriEncoding(String uriEncoding)
throws UnsupportedEncodingException {
if (!&&.equals(uriEncoding.trim())) {
this.uriEncoding = uriE
String enc = TenpayUtil.getCharacterEncoding(request, response);
Iterator it = this.parameters.keySet().iterator();
while (it.hasNext()) {
String k = (String) it.next();
String v = this.getParameter(k);
v = new String(v.getBytes(uriEncoding.trim()), enc);
this.setParameter(k, v);
public String getDebugInfo() {
return debugI
protected void setDebugInfo(String debugInfo) {
this.debugInfo = debugI
protected HttpServletRequest getHttpServletRequest() {
return this.
protected HttpServletResponse getHttpServletResponse() {
return this.
试试是不是已经可以发起异步回调了。记得key &在 &微信支付 -》API安全 &下面设置。
本文已收录于以下专栏:
相关文章推荐
Thinkphp集成微信支付SDK
遇到微信回调无法获取回调参数,导致重写的回调函数无法执行的问题
xml=xml = GLOBALS[‘HTTP_RAW_POST_DATA’];//无法获取参数...
微信支付 APP支付 Java 服务器端
本文介绍微信支付中APP支付-java服务端。
微信APP支付文档:https://pay./wiki/doc/api/app/...
网络绝对是任何系统的核心,对于容器而言也是如此。Docker 作为目前最火的轻量级容器技术,有很多令人称道的功能,如 Docker 的镜像管理。然而,Docker的网络一直以来都比较薄弱,所以我们有必要深入了解Docker的网络知识,以满足更高的网络需求。
因为自己项目上的APP 原来有支付宝支付,现在想要加上微信支付,所以去研究了微信APP支付的相关技术文档。虽然微信的相关的技术文档已经非常的清楚了。但是我还是想记录一下自己研究过程。
1 注册微信开放...
&!--google_ad_client = &p
微信公众号配置共五个地方:
1、设置key:微信商户平台——账户设置——API安全——密钥设置
2、页面授权域名:用来过的openID,公众号设置——功能设置——设置【网页授权域名】(【js安全域名】...
大家好,我是TT,互联网测试行业多年,遇到过的坑,走过的弯路,愿意与大家分享,分享自己的经验,少走弯路。首发于个人公众号【测试架构师】
原文如下:&#160;
当一个支付请求被发送到支...
首先 这个微信支付 官网的demo 是有bug的 研究了好几天
吸取了一些大神的指点才成功,还有csdn一些人发的代码都不全太坑,资源还少,今天我就整合一下,把我的一些心得分享给大家&#160;。
今天遇上了微信扫码支付成功,调用回调地址也成功,但是就是打印不出数据
开始在controller里写了这个代码看它返回的数据
Map data = new HashMap();...
首先,要提醒一下。微信支付跟支付回调是分开的。支付回调通常是微信收款成功后,回调你的php接口(带上$attach_data),在php接口中你根据$attach_data将购买的信息存到数据库。但微...
他的最新文章
讲师:董西成
讲师:唐宇迪
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)}

我要回帖

更多关于 ajax异步请求跳转页面 的文章

更多推荐

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

点击添加站长微信