通过易宝实现网上支付
网上支付一般有两种支付方式,一种是直接与银行对接的支付方式,另一种与第三方公司对接的方式i,比如易宝等等。第一种一般是现金流量较大的大公司使用。这里采用的是第二种。
第一步实现订单界面
<form action="servlet/PaymentSendServlet" method="POST"> <table align="center" width="600" border="6" cellspacing="0" cellpadding="2"> <tr> <td align="center" colspan="4" > <b>订单号:</b><input type="text" name="orderID"> <b>应付金额:¥</b><input type="text" name="amount" size="6"><b>元</b> </td> </tr> <tr> <td colspan="4"> </td> </tr> <tr> <td colspan="4" >请选择在线支付银行</td> </tr> <tr> <td height="25" width="24%"><input type="radio" name="pd_FrpId" value="ICBC-NET">工商银行</td> <td height="25" width="24%"><input type="radio" name="pd_FrpId" value="CMBCHINA-NET">招商银行</td> <td height="25" width="24%"><input type="radio" name="pd_FrpId" value="ABC-NET">农业银行</td> <td height="25" width="28%"><input type="radio" name="pd_FrpId" value="CCB-NET">建设银行</td> </tr> <tr> <td colspan="4"> </td> </tr> <tr> <td colspan="4" align="center" ><input type="submit" value=" 确认支付 "/></td> </tr> </table> </form>
第二步将信息转化为易宝公司接口所要求的数据格式。
这里需要一个商家号和相对应的密钥。(这里的商户号是传智播客的一位老师的,支付时请注意)
主要代码:
request.setCharacterEncoding("GBK"); //商户编号 String accountID = "10001126856"; //密钥 String keyValue = "69cl522AV6q613Ii4W6u8K6XuW8vM1N6bFgyv769220IuYe9u37N4y7rI4Pl"; //商户接收支付成功后返回地址 String accountCallbackURL = "http://127.0.0.1:8080/zhifu/PaymentResultServlet"; String orderID = request.getParameter("orderID"); //获取订单号 String amount = request.getParameter("amount"); //获取支付金额 String accountBankID = request.getParameter("pd_FrpId"); //获取用户所选择的银行 String businessType = "Buy"; //业务类型。Buy为在线支付 String currency = "CNY"; //交易币种。CNY为人民币 String productDesc = ""; //商品描述 String productCategory = ""; //商品种类 String productID = ""; //商品ID String addressFlag = "0"; //送货地址。0为不需要,1为需要 String accountMoreInfo = ""; //商户扩展信息 String pr_NeedResponse = "0"; //应答机制 String md5hmac = zhifuUtil.buildHmac( businessType, accountID, orderID, amount, currency, productID, productCategory, productDesc, accountCallbackURL, addressFlag, accountMoreInfo, accountBankID, pr_NeedResponse, keyValue); request.setAttribute("businessType", businessType); request.setAttribute("accountID", accountID); request.setAttribute("orderID", orderID); request.setAttribute("amount", amount); request.setAttribute("currency", currency); request.setAttribute("productID", productID); request.setAttribute("productCategory", productCategory); request.setAttribute("productDesc", productDesc); request.setAttribute("accountCallbackURL", accountCallbackURL); request.setAttribute("addressFlag", addressFlag); request.setAttribute("accountMoreInfo", accountMoreInfo); request.setAttribute("accountBankID", accountBankID); request.setAttribute("needResponse", pr_NeedResponse); request.setAttribute("md5hmac", md5hmac);
将数据处理后返回前段jsp中,并以数据隐藏的表单形式将信息提交到易宝接口(注:上述需要易宝的一个加密算法MD5+hmac)
<form action="https://www.yeepay.com/app-merchant-proxy/node" method="POST" name="yeepay"> <!-- 以下hidden中的name值为易宝支付规范的固定命名和顺序 --> <input type='hidden' name='p0_Cmd' value="${businessType}"> <input type='hidden' name='p1_MerId' value="${accountID}"> <input type='hidden' name='p2_Order' value="${orderID}"> <input type='hidden' name='p3_Amt' value="${amount}"> <input type='hidden' name='p4_Cur' value="${currency}"> <input type='hidden' name='p5_Pid' value="${productID}"> <input type='hidden' name='p6_Pcat' value="${productCategory}"> <input type='hidden' name='p7_Pdesc' value="${productDesc}"> <input type='hidden' name='p8_Url' value="${accountCallbackURL}"> <input type='hidden' name='p9_SAF' value="${addressFlag}"> <input type='hidden' name='pa_MP' value="${accountMoreInfo}"> <input type='hidden' name='pd_FrpId' value="${accountBankID}"> <input type="hidden" name='pr_NeedResponse' value="${needResponse}"> <input type='hidden' name='hmac' value="${md5hmac}"> <input type="submit" value="确认支付"> </form>
点击确定按钮提交表单。进入易宝的支付接口界面:
最后完成支付后,易宝会返回一组数据,最重要的是扣款结果若返回为1:扣款成功,否则扣款失败。我们对得到的数据进行判断即可。