java 银联,支付宝接口

   很多做电商的都需要和金额打交道,银联,支付宝等支付方式是必不可少的。

其实做这些东西都不难,难的主要是没有文档,demo。你只需要按照文档的要求来就行了,一切都ok。

这些东西拿到并不难,主要是你的商户需要去申请。申请了有商户号,密钥等这些必要的参数。不然你只能把代码写好,等银联,支付宝批下来了,你才可以调试

银联:

类型:unionpay

请求的参数

Map<String, String> sParaTemp = new HashMap<String, String>();
        // 这些是固定的信息
        sParaTemp.put("version", "1.0.0");                // 协议版本
        sParaTemp.put("charset", "UTF-8");                // 字符编码
        sParaTemp.put("transType", "01");                 // 交易类型 01代表的是支付交易
        sParaTemp.put("merAbbr", );           // 商户名称
        sParaTemp.put("merId", );                     // 商户代码
        sParaTemp.put("merCode", "");                     // 商户类型
        sParaTemp.put("backEndUrl",);            // 通知URL就是商户接收银联返回来的地址
        sParaTemp.put("frontEndUrl",);         // 当用户完成支付时候,跳转的URL地址
        sParaTemp.put("acqCode", "");                    // 收单机构
        // 订单信息
        sParaTemp.put("orderTime",);               // 订单时间
        sParaTemp.put("orderNumber", );          // 订单号
        sParaTemp.put("commodityName", );// 订单名称
        
        sParaTemp.put("commodityUrl", "");
        sParaTemp.put("commodityUnitPrice", "");             // 商品单价
        sParaTemp.put("commodityQuantity", "");              // 商品数量
        sParaTemp.put("transferFee", "");                    // 运输费用
        sParaTemp.put("commodityDiscount", "");              // 优惠信息
        sParaTemp.put("orderAmount", total_fee + "");        // 交易金额
        sParaTemp.put("orderCurrency", "156");               // 币种:人民币
        sParaTemp.put("customerName", );// 持卡人姓名,因为是邮箱注册,可能有非法字符,所以取会员ID
        sParaTemp.put("defaultPayType", "");                 // 默认支付方式
        sParaTemp.put("defaultBankNumber", "");              // 默认银行代码
        sParaTemp.put("transTimeout", "");                   // 交易超时时间
        sParaTemp.put("customerIp",);        // 持卡人IP
        
        sParaTemp.put("origQid", "");                        // 原交易流水号
        sParaTemp.put("merReserved", merReserved);                    // 商户保留域
        
        return UnionpayUtils.createPayHtml(sParaTemp, key); 这个方法是把你的参数进行排序,然后再拼一个form让它自动发送

public static String createPayHtml(Map<String, String> map, String key) {
        Map<String, String> treeMap = new TreeMap<String, String>();
        treeMap.putAll(map);
        treeMap.put("signature", md5(joinMapValue(treeMap, '&') + md5(key)));
        treeMap.put("signMethod", signType);
        return generateAutoSubmitForm(payment, treeMap);
    }

public static String joinMapValue(Map<String, String> map, char connector) {
        StringBuffer b = new StringBuffer();
        for (Map.Entry<String, String> entry : map.entrySet()) {
            b.append(entry.getKey());
            b.append('=');
            if (entry.getValue() != null) {
                b.append(entry.getValue());
            }
            b.append(connector);
        }
        System.out.println("params:"+b.toString());
        return b.toString();
    }

private static String generateAutoSubmitForm(String actionUrl,
            Map<String, String> paramMap) {
        StringBuilder html = new StringBuilder();
        html.append("<form id=\"pay_form\" name=\"pay_form\" action=\"");
        html.append(actionUrl).append("\" method=\"post\">\n");

        for (String key : paramMap.keySet()) {
            html.append("<input type=\"hidden\" name=\"" + key + "\" id=\""
                    + key + "\" value=\"" + paramMap.get(key) + "\">\n");
        }
        html.append("</form>");
        html.append("<script  language='JavaScript' type='text/JavaScript'>");
        html.append("document.pay_form.submit()");
        html.append("</script>");
        return html.toString();
    }

返回处理

public String  onReturn() {
        HttpServletRequest request  =  ThreadContextHolder.getHttpRequest();
        //获取银联过来反馈信息
        Map<String,String> params = new HashMap<String,String>();
        Map requestParams = request.getParameterMap();
        for (Iterator iter = requestParams.keySet().iterator(); iter.hasNext();) {
            String name = (String) iter.next();
            String[] values = (String[]) requestParams.get(name);
            String valueStr = "";
            for (int i = 0; i < values.length; i++) {
                valueStr = (i == values.length - 1) ? valueStr + values[i]
                        : valueStr + values[i] + ",";
            }
            params.put(name, valueStr);
        }
        String returnMsg = "";
       //进行参数验证

     if(checkSign(params)){

      处理自己的业务逻辑

}

        return returnMsg;
    }

/**
     * 支付返回的处理  验证签名
     */
    public boolean checkSign(Map<String, String> map) {
        Map<String,String> treeMap = new TreeMap<String,String>();
        treeMap.putAll(map);
        if (treeMap.get("signature") == null)
            return false;
        if (signType.equalsIgnoreCase(treeMap.get("signMethod"))) {
            return treeMap.get("signature")
                    .equals(md5(joinMapValue(treeMap, '&') + md5(securityKey)));
        } else {
            return verifyWithRSA(
                    treeMap.get("signMethod"),md5(joinMapValue(treeMap, '&') + md5(securityKey)),
                    treeMap.get("signature"));
        }
    }

基本完事,不晓得还有木有没有复制出来的(这些都是从我自己开发的项目中拿出来的)


支付宝:

类型:支付宝即时到账

//把请求参数打包成数组
            Map<String, String> sParaTemp = new HashMap<String, String>();
            sParaTemp.put("payment_type", "1");
            sParaTemp.put("out_trade_no",);//订单号
            sParaTemp.put("subject", );//订单名称
            sParaTemp.put("body", );//订单描述
            sParaTemp.put("total_fee",);//交易金额
            sParaTemp.put("show_url", );//商品的地址
            sParaTemp.put("paymethod", );//默认支付方式,取值见“即时到帐接口”技术文档中的请求参数列表
            sParaTemp.put("defaultbank", );//默认网银代号
            sParaTemp.put("anti_phishing_key", );//防钓鱼时间戳
            sParaTemp.put("exter_invoke_ip",);//获取客户端的IP地址
            sParaTemp.put("extra_common_param", );//自定义参数,可存放任何内容(除=、&等特殊字符外),不会显示在页面上
            sParaTemp.put("buyer_email", );//默认买家支付宝账号
            sParaTemp.put("royalty_type", );//提成类型,该值为固定值:10,不需要修改
            sParaTemp.put("royalty_parameters", );//提成信息集

            //增加基本配置 partner,seller_email 都是申请的时候需要的信息
            sParaTemp.put("service", "create_direct_pay_by_user");
            sParaTemp.put("partner",  );
            sParaTemp.put("return_url", );//返回地址
            sParaTemp.put("notify_url",  );//后台通知地址
            sParaTemp.put("seller_email", );//
            sParaTemp.put("_input_charset", );//这里支付宝有两种编码格式GBK,UTF-8

            return AlipaySubmit.buildForm(sParaTemp, AlipayService.ALIPAY_GATEWAY_NEW, "get",key);

这个AlipaySubmit.buildForm()是支付宝的包里面的方法,直接调用就行了

返回

Map<String,String> cfgparams = paymentManager.getConfigParams(this.getId());
        HttpServletRequest request  =  ThreadContextHolder.getHttpRequest();
        String key =cfgparams.get("key");
        String partner =cfgparams.get("partner");
        String encoding= cfgparams.get("return_encoding");

//获取支付宝GET过来反馈信息
        Map<String,String> params = new HashMap<String,String>();
        Map requestParams = request.getParameterMap();
        for (Iterator iter = requestParams.keySet().iterator(); iter.hasNext();) {
            String name = (String) iter.next();
            String[] values = (String[]) requestParams.get(name);
            String valueStr = "";
            for (int i = 0; i < values.length; i++) {
                valueStr = (i == values.length - 1) ? valueStr + values[i]: valueStr + values[i] + ",";
            }

             //根据自己的需求看看是否需要转码,如果你的tomcat 编码格式设置了UTF-8,基本不需要转码
             //            if(!StringUtil.isEmpty(encoding)){
             //                valueStr = StringUtil.to(valueStr, encoding);
            //            }
            params.put(name, valueStr);
        }

//计算得出通知验证结果
        boolean verify_result = AlipayNotify.returnverify(params,key,partner);

       if(("TRADE_FINISHED".equals(trade_status) || "TRADE_SUCCESS".equals(trade_status))){//验证成功

        //写你自己的业务逻辑,修改订单的状态什么的

}



评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值