SSH之订单支付

一、支付方式

        网站支付大概分为两种,一种是针对各行网银,另一种是针对第三方支付。如图:


二、支付过程

       通过以上支付方式的介绍,大概了解这两种方式的优缺点,接下来就看一下他们的支付过程:如图:


三、支付编码实现

        通过以上对支付的过程有了大概的了解,接下来就进行代码的实现:以下实例是通过第三方的易宝支付来完成的。

       

(1)支付工具类
packagecom.tgb.shop.utils;
 
importjava.io.UnsupportedEncodingException;
importjava.security.MessageDigest;
importjava.security.NoSuchAlgorithmException;
importjava.util.Arrays;
 
public classPaymentUtil {
 
privatestatic String encodingCharset = "UTF-8";
 
/**
 *生成hmac方法
 *
 * @paramp0_Cmd业务类型
 * @paramp1_MerId商户编号
 * @paramp2_Order商户订单号
 * @paramp3_Amt支付金额
 * @paramp4_Cur交易币种
 * @paramp5_Pid商品名称
 * @paramp6_Pcat商品种类
 * @paramp7_Pdesc商品描述
 * @paramp8_Url商户接收支付成功数据的地址
 * @paramp9_SAF送货地址
 * @parampa_MP商户扩展信息
 * @parampd_FrpId银行编码
 * @parampr_NeedResponse应答机制
 * @paramkeyValue商户密钥
 * @return
 */
publicstatic String buildHmac(String p0_Cmd,String p1_MerId,
Stringp2_Order, String p3_Amt, String p4_Cur,String p5_Pid, String p6_Pcat,
Stringp7_Pdesc,String p8_Url, String p9_SAF,String pa_MP,String pd_FrpId,
Stringpr_NeedResponse,String keyValue) {
StringBuildersValue = new StringBuilder();
//业务类型
sValue.append(p0_Cmd);
//商户编号
sValue.append(p1_MerId);
//商户订单号
sValue.append(p2_Order);
//支付金额
sValue.append(p3_Amt);
//交易币种
sValue.append(p4_Cur);
//商品名称
sValue.append(p5_Pid);
//商品种类
sValue.append(p6_Pcat);
//商品描述
sValue.append(p7_Pdesc);
//商户接收支付成功数据的地址
sValue.append(p8_Url);
//送货地址
sValue.append(p9_SAF);
//商户扩展信息
sValue.append(pa_MP);
//银行编码
sValue.append(pd_FrpId);
//应答机制
sValue.append(pr_NeedResponse);
 
returnPaymentUtil.hmacSign(sValue.toString(), keyValue);
}
 
/**
 *返回校验hmac方法
 *
 * @paramhmac支付网关发来的加密验证码
 * @paramp1_MerId商户编号
 * @paramr0_Cmd业务类型
 * @paramr1_Code支付结果
 * @paramr2_TrxId易宝支付交易流水号
 * @paramr3_Amt支付金额
 * @paramr4_Cur交易币种
 * @paramr5_Pid商品名称
 * @paramr6_Order商户订单号
 *@param r7_Uid易宝支付会员ID
 * @paramr8_MP商户扩展信息
 * @paramr9_BType交易结果返回类型
 * @paramkeyValue密钥
 * @return
 */
publicstatic boolean verifyCallback(String hmac, String p1_MerId,
Stringr0_Cmd, String r1_Code, String r2_TrxId, String r3_Amt,
Stringr4_Cur, String r5_Pid, String r6_Order, String r7_Uid,
Stringr8_MP, String r9_BType, String keyValue) {
StringBuildersValue = new StringBuilder();
//商户编号
sValue.append(p1_MerId);
//业务类型
sValue.append(r0_Cmd);
//支付结果
sValue.append(r1_Code);
//易宝支付交易流水号
sValue.append(r2_TrxId);
//支付金额
sValue.append(r3_Amt);
//交易币种
sValue.append(r4_Cur);
//商品名称
sValue.append(r5_Pid);
//商户订单号
sValue.append(r6_Order);
//易宝支付会员ID
sValue.append(r7_Uid);
//商户扩展信息
sValue.append(r8_MP);
//交易结果返回类型
sValue.append(r9_BType);
StringsNewString = PaymentUtil.hmacSign(sValue.toString(), keyValue);
returnsNewString.equals(hmac);
}
 
/**
 * @param aValue
 * @param aKey
 * @return
 */
publicstatic String hmacSign(String aValue, String aKey) {
bytek_ipad[] = new byte[64];
bytek_opad[] = new byte[64];
bytekeyb[];
bytevalue[];
try{
keyb= aKey.getBytes(encodingCharset);
value= aValue.getBytes(encodingCharset);
}catch (UnsupportedEncodingException e) {
keyb= aKey.getBytes();
value= aValue.getBytes();
}
 
Arrays.fill(k_ipad,keyb.length, 64, (byte) 54);
Arrays.fill(k_opad,keyb.length, 64, (byte) 92);
for(int i = 0; i < keyb.length; i++) {
k_ipad[i]= (byte) (keyb[i] ^ 0x36);
k_opad[i]= (byte) (keyb[i] ^ 0x5c);
}
 
MessageDigestmd = null;
try{
md= MessageDigest.getInstance("MD5");
}catch (NoSuchAlgorithmException e) {
 
returnnull;
}
md.update(k_ipad);
md.update(value);
bytedg[] = md.digest();
md.reset();
md.update(k_opad);
md.update(dg,0, 16);
dg= md.digest();
returntoHex(dg);
}
 
publicstatic String toHex(byte input[]) {
if(input == null)
returnnull;
StringBufferoutput = new StringBuffer(input.length * 2);
for(int i = 0; i < input.length; i++) {
intcurrent = input[i] & 0xff;
if(current < 16)
output.append("0");
output.append(Integer.toString(current,16));
}
 
returnoutput.toString();
}
 
/**
 *
 * @param args
 * @param key
 * @return
 */
publicstatic String getHmac(String[] args, String key) {
if(args == null || args.length == 0) {
return(null);
}
StringBufferstr = new StringBuffer();
for(int i = 0; i < args.length; i++) {
str.append(args[i]);
}
return(hmacSign(str.toString(), key));
}
 
/**
 * @param aValue
 * @return
 */
publicstatic String digest(String aValue) {
aValue= aValue.trim();
bytevalue[];
try{
value= aValue.getBytes(encodingCharset);
}catch (UnsupportedEncodingException e) {
value= aValue.getBytes();
}
MessageDigestmd = null;
try{
md= MessageDigest.getInstance("SHA");
}catch (NoSuchAlgorithmException e) {
e.printStackTrace();
returnnull;
}
returntoHex(md.digest(value));
 
}
 
}
    
 
  (2)Action实现
public classOrderAction extends ActionSupport implements ModelDriven<Order> {
//注入service
privateOrderService orderService;
//订单实体对象
privateOrder order =new Order();
 
//接收page
privateInteger page;
//接收支付通道编码:
privateString pd_FrpId;
//接收付款成功后的参数:
privateString r3_Amt;
privateString r6_Order;
 
publicvoid setPd_FrpId(String pd_FrpId) {
this.pd_FrpId= pd_FrpId;
}
publicvoid setR3_Amt(String r3_Amt) {
this.r3_Amt= r3_Amt;
}
publicvoid setR6_Order(String r6_Order) {
this.r6_Order= r6_Order;
}
publicInteger getPage() {
returnpage;
}
publicvoid setPage(Integer page) {
this.page= page;
}
//实现model
publicOrder getModel(){
returnorder;
}
publicvoid setOrderService(OrderService orderService) {
this.orderService= orderService;
}
 
//为订单付款:
publicString payOrder() throws IOException {
// 1.修改数据:
OrdercurrOrder = orderService.findByOid(order.getOid());
currOrder.setAddr(order.getAddr());
currOrder.setName(order.getName());
currOrder.setPhone(order.getPhone());
//修改订单
orderService.update(currOrder);
// 2.完成付款:
//付款需要的参数:
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.24.*:8088/shop/order_callBack.action"; // 商户接收支付成功数据的地址:
String p9_SAF = ""; //送货地址:
String pa_MP = ""; //商户扩展信息:
String pd_FrpId = this.pd_FrpId;//支付通道编码:
String pr_NeedResponse = "1";//应答机制:
String keyValue ="69cl522AV6q613Ii4W6u8K6XuW8vM1N6bFgyv769220IuYe9u37N4y7rI4Pl"; //秘钥
Stringhmac = 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
//向易宝发送请求:
StringBuffersb = newStringBuffer("https://www.yeepay.com/app-merchant-proxy/node?");
sb.append("p0_Cmd=").append(p0_Cmd).append("&");
sb.append("p1_MerId=").append(p1_MerId).append("&");
sb.append("p2_Order=").append(p2_Order).append("&");
sb.append("p3_Amt=").append(p3_Amt).append("&");
sb.append("p4_Cur=").append(p4_Cur).append("&");
sb.append("p5_Pid=").append(p5_Pid).append("&");
sb.append("p6_Pcat=").append(p6_Pcat).append("&");
sb.append("p7_Pdesc=").append(p7_Pdesc).append("&");
sb.append("p8_Url=").append(p8_Url).append("&");
sb.append("p9_SAF=").append(p9_SAF).append("&");
sb.append("pa_MP=").append(pa_MP).append("&");
sb.append("pd_FrpId=").append(pd_FrpId).append("&");
sb.append("pr_NeedResponse=").append(pr_NeedResponse).append("&");
sb.append("hmac=").append(hmac);
 
//重定向:向易宝出发:
ServletActionContext.getResponse().sendRedirect(sb.toString());
returnNONE;
}
 
//付款成功后跳转回来的路径:
publicString callBack(){
//修改订单的状态:
OrdercurrOrder = orderService.findByOid(Integer.parseInt(r6_Order));
//修改订单状态为2:已经付款:
currOrder.setState(2);
orderService.update(currOrder);
this.addActionMessage("支付成功!订单编号为: "+r6_Order +" 付款金额为: "+r3_Amt);
return"msg";
}
}

        3)接下来service层和dao的实现,相对来说很简单,这里就不一一列出。只要你有ssh框架的基础,其底层的实现就很容易。

         完成后重启tomcat,就可以进行付款:


 


 


      进入这个界面后就和网银对接,就可以完成支付,如图:
 


四、总结

        以上就是简单的订单支付过程,希望在今后的工作中会慢慢的积累,希望能有自己的发明专利哦!

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值