在项目开发时,也经常用到支付接口。那我们如何实现在线支付呢?
(一)在线支付方式
第一种方式:就是直接和银行对接,引用对应银行的接口。
优点:免费;
缺点:
1、需要引用所有银行的接口,比较麻烦;
2、商业银行一般只针对大型企业及集团公司提供接口,对个人及小企业的网站不支持。所以申请不易;
第二种方式:就是通过一个第三方支付平台,和银行对接;这个第三方支付平台就很类似我们学过的外观,整合所有接口,网站只需要调用第三方的接口就可以完成所有对接;
优点:简单,只需了解第三方的接口;
缺点:
1、收费;
2、风险;
(二)什么是第三方支付:
所谓第三方支付,就是一些和各大银行签约、并具备一定实力和信誉保障的第三方独立机构提供的交易支持平台。在通过第三方支付平台的交易中,买方选购商品后,使用第三方平台提供的账户进行货款支付,由第三方通知卖家货款到达。
目前中国国内的第三方支付产品主要有PayPal(易趣公司产品)、支付宝(阿里巴巴旗下)、易宝、财付通(腾讯公司)、快钱、百付宝(百度C2C)、环迅支付、汇付天下等,其中数量最大的用户群体是PayPal和支付宝,前者主要在欧美国家流行,后者是阿里巴巴旗下的产品。
(三)支付流程:
用户在支付的过程中,必须传递一些关键的参数,所以必须保证数据安全。可以采用数字签名的方式。如果作为练习,不妨用易宝提供的测试账号
p1_MerId=10001126856
keyValue=69cl522AV6q613Ii4W6u8K6XuW8vM1N6bFgyv769220IuYe9u37N4y7rI4Pl
responseURL= http://localhost:8080/onlinepay/servlet/PaymentResponse
//订单付款方法
public String payOrder() throws IOException {
//修改订单
Order currOrder = orderService.findByOid(order.getOid());
currOrder.setAddr(order.getAddr());
currOrder.setName(order.getName());
currOrder.setPhone(order.getPhone());
orderService.update(currOrder);
//完成付款
String p0_Cmd = "Buy"; // 业务类型:
String p1_MerId = "10001126856";// 商户编号:
String p2_Order = order.getOid().toString();// 订单编号:
String p3_Amt = "0.01"; // 付款金额:
String p4_Cur = "CNY"; // 交易币种:
String p5_Pid = ""; // 商品名称:
String p6_Pcat = ""; // 商品种类:
String p7_Pdesc = ""; // 商品描述:
String p8_Url = "http://192.168.??.???:8080/MyShop/order_callBack.action"; // 商户接收支付成功数据的地址:
String p9_SAF = ""; // 送货地址:
String pa_MP = ""; // 商户扩展信息:
String pd_FrpId = this.pd_FrpId;// 支付通道编码:
String pr_NeedResponse = "1"; // 应答机制:
String keyValue = "69cl522AV6q613Ii4W6u8K6XuW8vM1N6bFgyv769220IuYe9u37N4y7rI4Pl";
String hmac = PaymentUtil.buildHmac(p0_Cmd, p1_MerId, p2_Order, p3_Amt,
p4_Cur, p5_Pid, p6_Pcat, p7_Pdesc, p8_Url, p9_SAF, pa_MP,
pd_FrpId, pr_NeedResponse, keyValue); // hmac
//向易宝出发
StringBuffer stringBuffer = new StringBuffer("https://www.yeepay.com/app-merchant-proxy/node?");
stringBuffer.append("p0_Cmd=").append(p0_Cmd).append("&");
stringBuffer.append("p1_MerId=").append(p1_MerId).append("&");
stringBuffer.append("p2_Order=").append(p2_Order).append("&");
stringBuffer.append("p3_Amt=").append(p3_Amt).append("&");
stringBuffer.append("p4_Cur=").append(p4_Cur).append("&");
stringBuffer.append("p5_Pid=").append(p5_Pid).append("&");
stringBuffer.append("p6_Pcat=").append(p6_Pcat).append("&");
stringBuffer.append("p7_Pdesc=").append(p7_Pdesc).append("&");
stringBuffer.append("p8_Url=").append(p8_Url).append("&");
stringBuffer.append("p9_SAF=").append(p9_SAF).append("&");
stringBuffer.append("pa_MP=").append(pa_MP).append("&");
stringBuffer.append("pd_FrpId=").append(pd_FrpId).append("&");
stringBuffer.append("pr_NeedResponse=").append(pr_NeedResponse).append("&");
stringBuffer.append("hmac=").append(hmac);
//重定向到易宝
ServletActionContext.getResponse().sendRedirect(stringBuffer.toString());
return NONE;
}
//付款成功后的转向
public String callBack() {
//修改订单状态,为已经付款
Order currOrder = orderService.findByOid(Integer.parseInt(r6_Order));
currOrder.setState(2);
orderService.update(currOrder);
//在页面上显示付款成功信息!
this.addActionMessage("订单付款成功:订单编号:"+r6_Order+"订单金额:"+r3_Amt);
return "msg";
}
具体的参数说明,可以查看易宝帮助文档(关于支付请求参数说明、支付结果参数说明)。