欢迎加群:854228077。
帮助更多java程序员提升技术!资料多,大佬多!
提供信息:
首先商家支付宝收款账号要提供
接口方给接口文档
使用环境:
1.支付宝APP扫码进入H5 web端,购买商品,下单支付。
2.其他购物APP,如KFC官方APP扫码进入H5 web端,购买商品,下单支付。
对接大致流程:
1.调用第三方提供的接口getPaymentUrl(每家公司定义不同)
这个接口的作用是,我这边把基础参数以json格式,传递给ecpay那边的这个接口中,他们会处理这个json参数,向支付宝方发起请求,并且获取到一个form表单,直接返回给我这边。
2.我这边直接把这个form表单转发到前端,前端用JS方法拉起收银台(这里的收银台就是支付宝官方的输入密码界面,术语称为收银台)
3.选择付款方式,是花呗,余额,银行卡等,输入密码。
4.支付宝官方会回调支付成功的响应界面,第三方支付接口会回调我这边的支付结果告知接口,告知我们支付结果。最后,把支付结果返回给我们提供给他们的结果响应页面。
整个支付对接流程,就是这样,是不是很简单。
在这里,我这边条件限制,没有网络环境,所以,我只能按照第三方的接口,及这个交互流程,用支付宝沙箱环境模拟开发。
也就是模拟第三方的getPaymentUrl接口,调用支付宝沙箱支付接口,获取form表单,然后,把返回结果返回给前端页面,实现拉起收银台的动作。
收银台被拉起了,支付就不是问题了。
所以,这个块对接工作的难点就是在如何模拟拉起收银台。
上代码:
第一步:前端点击立即付款,调用我们自己后端的接口。
/**
* 注意,因为涉及到商业隐私,这里算是伪代码,我只贴了关于接口对接的主要代码。
*/
public Object PayRoadDemo(HttpServletRequest request,PayParams params) throws Exception {
String jsonParam="";
if("ALIPAY".equals(payWay)) {//获取支付宝支付方式的json参数。
portalType="F2FWAP";
jsonParam=getJsonParams();//生成第三方需要的json数据方法。
}
logger.info(jsonParam);
//调用自己模拟编写的getPaymentURL接口,获取沙箱返回的form表单数据。
HttpResponse response=HttpRequest.post("http://127.0.0.1/Alipay/Pay/getPaymentURL.do")
.header("Content-Type","application/json")
.body(jsonParam)
.execute();
//从body中读取返回结果数据。
BufferedReader tBufferedReader = new BufferedReader(new InputStreamReader(response.bodyStream()));
StringBuffer checkoutUrl = new StringBuffer();
String sTempOneLine = new String("");
while ((sTempOneLine = tBufferedReader.readLine()) != null){
checkoutUrl.append(sTempOneLine);
}
logger.info(checkoutUrl);
return checkoutUrl;//返回拉起收银台的url给前端。
}
第二步:调用getPaymentURL接口,获取form表单,拉起收银台。
/**
* 注意,因为涉及到商业隐私,这里算是伪代码,我只贴了关于接口对接的主要代码。
* 这个接口的编写,需要引入支付宝的SDK
*
* com.alipay.sdk
* alipay-sdk-java
* 3.3.4.ALL
*
*/
public Object getPaymentURL(HttpServletRequest request,HttpServletResponse response) throws IOException {
String jsonParam="";
String str = "";
//从调用方发起的http请求,获取json参数。
BufferedReader br;
br = request.getReader();
while((str = br.readLine()) != null){
jsonParam += str;
}
logger.info("jsonParam:"+jsonParam);
//把json参数转成map格式,读取内容。
JSONObject jsonData = JSONObject.parseObject(jsonParam);
Map<String,Object> dataMap = (Map<String,Object>)jsonData;
JSONObject paymentOrder = JSONObject.parseObject(dataMap.get("paymentOrder").toString());
Map<String,Object> paymentOrderMap = (Map<String,Object>)paymentOrder;
//支付宝接口需要的参数。
String out_trade_no=new String(paymentOrderMap.get("orderId").toString().getBytes("ISO-8859-1"),
"UTF-8");//商户订单号
String subject=new String(paymentOrderMap.get("orderId").toString().getBytes("ISO-8859-1"),
"UTF-8");//订单名称
String total_amount=new String(paymentOrderMap.get("orderFee").toString().
getBytes("ISO-8859-1"),"UTF-8");//付款金额
String body=new String("无".getBytes("ISO-8859-1"),"UTF-8");//商品描述
String timeout_express=new String("3m".toString().getBytes("ISO-8859-1"),"UTF-8");//超时时间 可空
String product_code=new String("QUICK_WAP_WAY".toString().getBytes("ISO-8859-1"),
"UTF-8");// 销售产品码 必填
//调用RSA签名方式,下面这段代码来自支付宝官方demo。
AlipayClient client = new DefaultAlipayClient(AlipayConfig.URL, AlipayConfig.APPID,
AlipayConfig.RSA_PRIVATE_KEY, AlipayConfig.FORMAT, AlipayConfig.CHARSET,
AlipayConfig.ALIPAY_PUBLIC_KEY,AlipayConfig.SIGNTYPE);
AlipayTradeWapPayRequest alipay_request=new AlipayTradeWapPayRequest();
// 封装请求支付信息
AlipayTradeWapPayModel model=new AlipayTradeWapPayModel();
model.setOutTradeNo(out_trade_no);
model.setSubject(subject);
model.setTotalAmount(total_amount);
model.setBody(body);
model.setTimeoutExpress(timeout_express);
model.setProductCode(product_code);
alipay_request.setBizModel(model);
// 设置异步通知地址
alipay_request.setNotifyUrl(AlipayConfig.notify_url);
// 设置同步地址
alipay_request.setReturnUrl(AlipayConfig.return_url);
// form表单生产
String form = "";
try {
// 调用SDK生成表单
form = client.pageExecute(alipay_request).getBody();
//这个字符编码格式,必须要设置,否则前端跳转时候会报**签名错误**,亲自掉坑。
response.setContentType("text/html;charset=" + AlipayConfig.CHARSET);
} catch (AlipayApiException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return form;
}
第三步:前端获取返回结果的JS代码,拉起收银台。
$.ajax({
type: "post",
url:'${path}/Pay/PayRoadDemo.do',
data:{
Ip:'127.0.0.1',
payWay:'ALIPAY',
orderFee:'50',
mobile:'13344445555',
orderId:'1111111111'
},
dataType:"json",
success:function(url){
console.log(url);
//下面四行代码是主要代码。
const div = document.createElement('div');
div.innerHTML = url;//此处form就是后台返回接收到的数据
document.body.appendChild(div);
document.forms[1].submit();//这里注意下forms[1],更具自己的情况来。
}
});
附文:官方demo下载地址。(这里具体如何使用官方网站的教程,就不细说了)
先登录:https://openhome.alipay.com/platform/manageHome.htm
在进入:
demo下载地址:https://docs.open.alipay.com/54/