使用易宝支付接口实现java网上支付功能。

本文介绍了一种基于Java的易宝支付集成方案,包括支付请求的生成与回调验证的过程。通过具体的代码实现展示了如何使用HMAC算法确保支付数据的安全性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

易宝支付工具类


package com.kdyzm.utils;


import java.io.UnsupportedEncodingException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Arrays;


public class PaymentUtil {


    private static String encodingCharset = "UTF-8";

    /**
      * 生成hmac方法
      * 
      * @param p0_Cmd 业务类型
      * @param p1_MerId 商户编号
      * @param p2_Order 商户订单号
      * @param p3_Amt 支付金额
      * @param p4_Cur 交易币种
      * @param p5_Pid 商品名称
      * @param p6_Pcat 商品种类
      * @param p7_Pdesc 商品描述
      * @param p8_Url 商户接收支付成功数据的地址
      * @param p9_SAF 送货地址
      * @param pa_MP 商户扩展信息
      * @param pd_FrpId 银行编码
      * @param pr_NeedResponse 应答机制
      * @param keyValue 商户密钥
      * @return
    */
    public static String buildHmac(String p0_Cmd,String p1_MerId,
        String p2_Order, String p3_Amt, String p4_Cur,String p5_Pid, String p6_Pcat,String p7_Pdesc,String p8_Url, String p9_SAF,String pa_MP,String pd_FrpId,String pr_NeedResponse,String keyValue) {
        StringBuilder sValue = 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);

    return PaymentUtil.hmacSign(sValue.toString(), keyValue);
}

    /**
        * 返回校验hmac方法
        * 
        * @param hmac 支付网关发来的加密验证码
        * @param p1_MerId 商户编号
        * @param r0_Cmd 业务类型
        * @param r1_Code 支付结果
        * @param r2_TrxId 易宝支付交易流水号
        * @param r3_Amt 支付金额
        * @param r4_Cur 交易币种
        * @param r5_Pid 商品名称
        * @param r6_Order 商户订单号
        * @param r7_Uid 易宝支付会员ID
        * @param r8_MP 商户扩展信息
        * @param r9_BType 交易结果返回类型
        * @param keyValue 密钥
        * @return
    */
    public static boolean verifyCallback(String hmac, String p1_MerId,String r0_Cmd, String r1_Code, String r2_TrxId, String r3_Amt,String r4_Cur, String r5_Pid, String r6_Order, String r7_Uid,String r8_MP, String r9_BType, String keyValue) {
        StringBuilder sValue = 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);
        String sNewString = PaymentUtil.hmacSign(sValue.toString(), keyValue);
    return sNewString.equals(hmac);
}

/**
* @param aValue
* @param aKey
* @return
*/
public static String hmacSign(String aValue, String aKey) {
    byte k_ipad[] = new byte[64];
    byte k_opad[] = new byte[64];
    byte keyb[];
    byte value[];
    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);
    }


    MessageDigest md = null;
    try {
        md = MessageDigest.getInstance("MD5");
    } catch (NoSuchAlgorithmException e) {

        return null;
    }
    md.update(k_ipad);
    md.update(value);
    byte dg[] = md.digest();
    md.reset();
    md.update(k_opad);
    md.update(dg, 0, 16);
    dg = md.digest();
    return toHex(dg);
}


public static String toHex(byte input[]) {
    if (input == null)return null;
    StringBuffer output = new StringBuffer(input.length * 2);
    for (int i = 0; i < input.length; i++) {
        int current = input[i] & 0xff;
        if (current < 16)
            output.append("0");
            output.append(Integer.toString(current, 16));
        }
    }

    return output.toString();
}


/**
* 
* @param args
* @param key
* @return
*/
public static String getHmac(String[] args, String key) {
    if (args == null || args.length == 0) {
        return (null);
    }    
    StringBuffer str = new StringBuffer();
    for (int i = 0; i < args.length; i++) {
        str.append(args[i]);
    }
    return (hmacSign(str.toString(), key));
}


/**
* @param aValue
* @return
*/
public static String digest(String aValue) {
    aValue = aValue.trim();
    byte value[];
    try {
        value = aValue.getBytes(encodingCharset);
    } catch (UnsupportedEncodingException e) {
        value = aValue.getBytes();
    }
    MessageDigest md = null;
    try {
        md = MessageDigest.getInstance("SHA");
    } catch (NoSuchAlgorithmException e) {
        e.printStackTrace();
        return null;
    }
    return toHex(md.digest(value));

}

}

//该Servlet处理支付请求并进行重定向 

package com.kdyzm.servlet;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.kdyzm.utils.PaymentUtil;

//该Servlet处理支付请求并进行重定向
public class PayServlet extends HttpServlet {
    public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {
        this.doPost(request, response);
    }
public void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {
    request.setCharacterEncoding("utf-8");
    response.setContentType("text/html;charset=utf-8");
    String p0_Cmd="Buy",
    p1_MerId="10001126856",
    p2_Order=request.getParameter("p2_Order"),
    p3_Amt=request.getParameter("p3_Amt"),
    p4_Cur="CNY",
    p5_Pid="",
    p6_Pcat="",
    p7_Pdesc="",
    p8_Url="http://localhost:8080/day21_2_pay/backServlet",//此处换成自己的路径
    p9_SAF="",
    pa_MP="",
    pd_FrpId=request.getParameter("pd_FrpId"),
    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);
    String url="https://www.yeepay.com/app-merchant-proxy/node?"+
    "&p0_Cmd="+p0_Cmd+
    "&p1_MerId="+p1_MerId+
    "&p2_Order="+p2_Order+
    "&p3_Amt="+p3_Amt+
    "&p4_Cur="+p4_Cur+
    "&p5_Pid="+p5_Pid+
    "&p6_Pcat="+p6_Pcat+
    "&p7_Pdesc="+p7_Pdesc+
    "&p8_Url="+p8_Url+
    "&p9_SAF="+p9_SAF+
    "&pa_MP="+pa_MP+
    "&pd_FrpId="+pd_FrpId+
    "&pr_NeedResponse="+pr_NeedResponse+
    "&hmac="+hmac;
    response.sendRedirect(url);
    }
}

//显示支付结果的页面

package com.kdyzm.servlet;

import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

//显示支付结果的页面
public class BackServlet extends HttpServlet {

    public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {
        this.doPost(request, response);
    }
public void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {
    request.setCharacterEncoding("utf-8");
    response.setContentType("text/html;charset=utf-8");
    String r1_Code=request.getParameter("r1_Code");
    PrintWriter pw=response.getWriter();
    if("1".equals(r1_Code)){
        String p1_MerId=request.getParameter("p1_MerId");
        String r3_Amt=request.getParameter("r3_Amt");
        String r6_Order=request.getParameter("r6_Order");
        String rp_PayDate=request.getParameter("rp_PayDate");
        pw.println("支付成功!<br/>"+ "商户编号:"+p1_MerId+"<br/>"+ "支付金额:"+r3_Amt+"<br/>"+"商户订单号:"+r6_Order+"<br/>"+"支付成功时间:"+rp_PayDate);
    }else{
        pw.println("支付失败!");
    }
   }

}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

星空宇航员

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值