博客
关于我
【Java EE 学习 21 下】【 使用易宝支付接口实现java网上支付功能】
阅读量:427 次
发布时间:2019-03-06

本文共 6846 字,大约阅读时间需要 22 分钟。

一、网上支付分为两种情况,一种方法是使用直接和银行的支付接口,另外一种方法是使用第三方支付平台和银行对接完成支付。

  1.直接和银行对接。

  

  2.使用第三方支付平台

  

  3.常见的第三方支付平台

  

二、使用易宝支付接口实现java网上支付功能(农业银行)。

  1.完整源代码:

  2.实现过程的时序图

   

  3.技术要点

    (1)使用GET请求的时候必须将全部参数都带上,参数名称参考开发者文档中的请求参数列表

    (2)使用PaymentUtil类实现加密,该类由易宝支付公司编写

    (3)支付成功之后通知商户按钮指向的url在本地,即http://localhost:8080/backServlet(localhost只在本地有意义),为什么能够成功返回这里,原理见上面流程图。关键点:重定向技术解决了这一问题。

  4.需要的几点信息。

    (1)商户账号:p1_MerId=10001126856

    (2)商户的keyVaue:keyValue=69cl522AV6q613Ii4W6u8K6XuW8vM1N6bFgyv769220IuYe9u37N4y7rI4Pl

    (3)PaymentUtil类。

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));    }    //    public static void main(String[] args) {//        System.out.println(hmacSign("AnnulCard1000043252120080620160450.0http://localhost/SZXpro/callback.asp杩?4564868265473632445648682654736324511","8UPp0KE8sq73zVP370vko7C39403rtK1YwX40Td6irH216036H27Eb12792t"));//    }}
PaymentUtil.java

    (4)注意:该商户账号是传智播客某老师的账号,在进行测试的时候会实际打钱过去,所以在选择支付数额的时候千万要谨慎!!!

  5.支付过程:

    (1)填写订单信息

      

    (2)单击支付按钮之后重定向到农业银行支付界面(如果网速慢点能够看到易宝支付处理的过程

    

    (3)我进行的是K码支付

  

    (4)填写相应的信息,进行身份验证之后(短信),单击确定按钮(谷歌浏览器不支持后续操作,我换了IE浏览器)

    

    (5)支付成功,自动跳转到支付成功页面

      

    (6)单击通知商户按钮,跳转到的页面是同一个。

      

 

三、总结

  1、java实现网上支付功能并不难,几乎没有任何技术要点,关键就是太繁琐,要学会读开发者文档。

  2.重定向技术在这里非常重要,要根据时序图理解重定向在这里的使用。

 

转载地址:http://ykcyz.baihongyu.com/

你可能感兴趣的文章
Redis源码分析(七)--- zipmap压缩图
查看>>
【MySQL】(九)触发器
查看>>
Oracle 11G环境配置
查看>>
【Python】(十二)IO 文件处理
查看>>
【Oozie】(三)Oozie 使用实战教学,带你快速上手!
查看>>
师兄面试遇到这条 SQL 数据分析题,差点含泪而归!
查看>>
C语言的数值溢出问题(上)
查看>>
8051单片机(STC89C52)以定时器中断模式实现两倒计时器异步计时
查看>>
vue项目通过vue.config.js配置文件进行proxy反向代理跨域
查看>>
android:使用audiotrack 类播放wav文件
查看>>
ACM/NCPC2016 C Card Hand Sorting(upc 3028)
查看>>
SLAM学习笔记-求解视觉SLAM问题
查看>>
程序员应该知道的97件事
查看>>
shell编程(六)语言编码规范之(变量)
查看>>
vimscript学习笔记(二)预备知识
查看>>
Android数据库
查看>>
HTML基础,块级元素/行内元素/行内块元素辨析【2分钟掌握】
查看>>
23种设计模式一:单例模式
查看>>
Qt中的析构函数
查看>>
三层框架+sql server数据库 实战教学-徐新帅-专题视频课程
查看>>