Skip to content

trade.pay

李春寅 edited this page Jan 31, 2019 · 12 revisions

交易支付trade.pay

SDK为交易支付接口 trade.pay 编写的相关操作类有

接口请求

trade.pay接口的请求 一般情况下使用TradePayRequest.post()方法发起支付请求。但是在PC页面或者H5那种html页面的坏境中可能采用表单提交的方式请求接口,使用TradePayRequest.submit();

换句话说(在我编写这份文档的时候),如果trade.pay接口的channel参数为ALIPAY_PC或者WXPAY_H5的话,使用TradePayRequest.submit()请求接口,页面会跳转到支付宝支付页面,或者微信的支付页面。其他情况下使用TradePayRequest.post(),你会得到一个TradePayResponse响应。

TradePayRequest包含如下可以被用来设置参数的方法:

  • public void setChannel(String channel) 支付渠道,必须设置
  • public void setClientIp(String client_ip) 客户端ip,必须设置
  • public void setNotifyUrl(String notify_url) 聚合平台服务器主动通知接入应用指定的http url
  • public void setOutTradeNo(String out_trade_no) 交易编号 必须设置
  • public void setReturnUrl(String return_url) 聚合平台跳转到接入应用的指定url,返回参数通过get传递
  • public void setThirdPart(String third_part) 第三方支付平台的参数,请自行查阅相关支付平台相关文档中的参数列表
  • public void setTitle(String title) 交易标题 必须设置
  • public void setTotalFee(Integer total_fee) 交易金额 单位为分 必须设置

channel参数所支持的渠道:

  • ALIPAY_PC
  • ALIPAY_QRCD
  • WXPAY_H5
  • WXPAY_QRCD

代码示例(post方法场景):

TradePayRequest request = new TradePayRequest();
request.setChannel("ALIPAY_QRCD"); //支付宝买家扫商户码。
request.setTitle("支付测试");
request.setClientIp("127.0.0.1");
request.setNotifyUrl("notify_url"); //交易支付状态变更时,通知商户的url
request.setOutTradeNo("1000000011") //商户的订单编号,必须唯一
request.setTotalFee("0.01"); //订单的金额
TradePayResponse response = (TradePayResponse) request.post();
if(response.getIsSuccess()){
  // 请求成功,输出二维码
  // response.getQrCode();
  // .....
}else{
  // 请求失败
  // response.getDataCode() //接口响应值code
  // response.getMessage() //失败的原因
  // ......
}

代码示例(submit方法场景):

TradePayRequest request = new TradePayRequest();
request.setChannel("ALIPAY_PC"); //支付宝PC端支付。
request.setTitle("支付测试");
request.setClientIp("127.0.0.1");
request.setNotifyUrl("notify_url"); //交易支付状态变更时,通知商户的url
request.setReturnUrl("return_url"); //交易支付操作后,从聚合平台跳转到商户端的url
request.setOutTradeNo("1000000011") //商户的订单编号,必须唯一
request.setTotalFee("0.01"); //订单的金额

PrintWriter out = httpServletResponse.getWriter();
out.write(request.submit());
out.flush();
out.close();

request.submit(),方法请求接口不会得到response响应值。需要通过notify_url和return_url接收Notify通知,来处理支付结果。 接口的Notify响应值

接口的response响应值

tradePayRequest.post() 方法会返回一个 tradePayResponse 结果。tradePayResponse 是 trade.pay响应值的解析类,它会把响应只json转换为 tradePayResponse 对象。tradePayResponse 具有如下可用的方法获取响应结果中的字段:

  • public boolean getIsSuccess() HTTP code等于200,并且Response Json中code等于"0",并且Response Json中Sign值有效时返回true,其他情况都返回false。
  • public String getMessage() HttpCode等于200时,message等于response json中的message。否则提示异常信息
  • public String getDataCode() Response Json中的code
  • public HashMap<String, Object> getDecodedData() Response Json,经过json decode后的结果
  • public Integer getHttpCode() Http code
  • public String getHttpBody() Http body应该是一个json
  • public Map<String, List<String>> getHttpHeaders() http headers
  • public String getCancelYmdhis() 交易取消时间
  • public String getChannel() 支付渠道
  • public String getClientIp() 客户ip
  • public String getInTradeNo() 交易编号 与支付请求的编号对应的聚合平台生成的交易编号 是一个全局唯一的编号
  • public String getOutTradeNo() 交易编号(商户)
  • public String getPayedYmdhis() 交易支付成功[不可退款]时间
  • public String getPayokYmdhis() 交易支付成功[可退款]时间
  • public String getQrCode() 二维码(买家扫商家适用),渠道类型为ALIPAY_QRCD或WXPAY_QRCD时这个字段才有意义
  • public String getTitle() 交易标题
  • public String getTotalFee() 交易金额 单位为分
  • public String getTradeStatus() 交易状态 NOPAY[尚未支付] CANCLE[取消支付] PAYFAILED[支付失败] PAYING[正在支付] PAYOK[支付成功-可退款] PAYED[支付成功-不可退款]

response处理示例:

TradePayResponse response = (TradePayResponse) request.post();
if(response.getIsSuccess()){
  // 请求成功,输出二维码
  // response.getQrCode();
  // .....
}else{
  // 请求失败
  // response.getDataCode() //接口响应值code
  // response.getMessage() //失败的原因
  // ......
}

接口的Notify响应值

notify响应值通过接口请求时传递的notify_url或者return_url接收。使用asbamboo.java.sdk.notify.TradePayNotify类可以解析响应结果。 注意在使用解析结果前,先使用TradePayNotify.checkSign()方法判断签名是否有效,防止黑客发起恶意通知。

asbamboo.java.sdk.notify.TradePayNotify提供了如下方法:

  • public boolean checkSign() 验证签名是否有效,如果有效,那么返回 true,否则返回 false
  • public String getCancelYmdhis() 交易取消时间
  • public String getChannel() 支付渠道
  • public String getClientIp() 客户ip
  • public String getInTradeNo() 交易编号 与支付请求的编号对应的聚合平台生成的交易编号 是一个全局唯一的编号
  • public String getOutTradeNo() 交易编号(商户)
  • public String getPayedYmdhis() 交易支付成功[不可退款]时间
  • public String getPayokYmdhis() 交易支付成功[可退款]时间
  • public String getQrCode() 二维码(买家扫商家适用),渠道类型为ALIPAY_QRCD或WXPAY_QRCD时这个字段才有意义
  • public String getTitle() 交易标题
  • public String getTotalFee() 交易金额 单位为分
  • public String getTradeStatus() 交易状态 NOPAY[尚未支付] CANCLE[取消支付] PAYFAILED[支付失败] PAYING[正在支付] PAYOK[支付成功-可退款] PAYED[支付成功-不可退款]
  • public String getSign() 响应签名
  • public String getRandom() 响应随机数

notify使用示例:

TradePayNotify notify = new TradePayNotify(request);
if(notify.chheckSign()){
  // ... 逻辑处理
}
Clone this wiki locally