个人免签支付怎么对接支付宝微信?

在我们的生活中,电子商务离不开支付渠道,而支付方式有支付宝、微信、网银等,常用的是微信和支付宝,所以我们今天来说说个人怎么对接支付宝和微信支付?

一般官方的支付宝、微信需要企业资质,那么个人要怎么才能对接支付宝微信呢?

首先,你必须要有自己的个人微信和支付宝,然后在速码支付平台注册好商户。

然后准备一个旧手机,比如红米4A,不需要ROOT,在官网下载需要的软件。这些官网都有教程,按步骤弄就可以了。

现在我们来看下怎么对接到我们的网站,首先看下官方给我们的技术文档:

扫码支付API文档

接口URL:http://www.xxx.top/gateway/index/checkpoint.do

参数(POST) 说明 示例
account_id 商户ID、在平台首页右边获取商户ID 10000
content_type 请求过程中返回的网页类型,text (扫码支付 )或 json(H5支付) json
thoroughfare 初始化支付通道,目前通道:wechat_auto(商户版微信)、alipay_auto(商户版支付宝)、bank_auto(商户版支付宝转账)、service_auto(服务版微信/支付宝) wechat_auto
type 支付类型,该参数在服务版下有效(service_auto),其他可为空参数,微信:1,支付宝:2 ,支付宝转银行卡:3 1
out_trade_no 订单信息,在发起订单时附加的信息,如用户名,充值订单号等字段参数 2018062668945
robin 轮训,2:开启轮训,1:进入单通道模式 2
keyId 设备KEY,在商户版列表里面Important参数下的DEVICE Key一项,如果该请求为轮训模式,则本参数无效,本参数为单通道模式 785D239777C4DE7739
amount 支付金额,在发起时用户填写的支付金额 1.00
callback_url 异步通知地址,在支付完成时,本平台服务器系统会自动向该地址发起一条支付成功的回调请求, 对接方接收到回调后,必须返回 success ,否则默认为回调失败,回调信息会补发3次。 http://www.xxx.top/index/index/callback.do
success_url 支付成功后网页自动跳转地址,仅在网页类型为text下有效,json会将该参数返回 http://www.xxx.top/index/doc/getQrcode.do
error_url 支付失败时,或支付超时后网页自动跳转地址,仅在网页类型为text下有效,json会将该参数返回 http://www.xxx.top/index/doc/getQrcode.do
sign 签名算法,在支付时进行签名算法,详见《速码支付签名算法》 d92eff67b3be05f5e61502e96278d01b

 

签名算法

PHP版本签名算法


     <\?php
/**
 * 签名算法
 * @param unknown $key_id S_KEY(商户KEY)
 * @param unknown $array 例子:$array = array('amount'=>'1.00','out_trade_no'=>'2018123645787452');
 * @return string
 */
function sign ($key_id, $array)
{
         $data = md5(sprintf("%.2f", $array['amount']) . $array['out_trade_no']);
        $key[] ="";
        $box[] ="";
        $pwd_length = strlen($key_id);
        $data_length = strlen($data);
        for ($i = 0; $i < 256; $i++)
        {
            $key[$i] = ord($key_id[$i % $pwd_length]);
            $box[$i] = $i;
        }
        for ($j = $i = 0; $i < 256; $i++)
        {
            $j = ($j + $box[$i] + $key[$i]) % 256;
            $tmp = $box[$i];
            $box[$i] = $box[$j];
            $box[$j] = $tmp;
        }
        for ($a = $j = $i = 0; $i < $data_length; $i++)
        {
            $a = ($a + 1) % 256;
            $j = ($j + $box[$a]) % 256;
            
            $tmp = $box[$a];
            $box[$a] = $box[$j];
            $box[$j] = $tmp;
            
            $k = $box[(($box[$a] + $box[$j]) % 256)];
            $cipher .= chr(ord($data[$i]) ^ $k);
        }
        return md5($cipher);
}
?>
     

JAVA版本签名算法


   public class Sign {

    public static String decry_RC4(byte[] data, String key) {
        if (data == null || key == null) {
            return null;
        }
        return asString(RC4Base(data, key));
    }

    public static String decry_RC4(String data, String key) {
        if (data == null || key == null) {
            return null;
        }
        return new String(RC4Base(HexString2Bytes(data), key));
    }

    public static byte[] encry_RC4_byte(String data, String key) {
        if (data == null || key == null) {
            return null;
        }
        byte b_data[] = data.getBytes();
        return RC4Base(b_data, key);
    }

    public static String encry_RC4_string(String data, String key) {
        if (data == null || key == null) {
            return null;
        }
        return toHexString(asString(encry_RC4_byte(data, key)));
    }

    private static String asString(byte[] buf) {
        StringBuffer strbuf = new StringBuffer(buf.length);
        for (int i = 0; i < buf.length; i++) {
            strbuf.append((char) buf[i]);
        }
        return strbuf.toString();
    }

    private static byte[] initKey(String aKey) {
        byte[] b_key = aKey.getBytes();
        byte state[] = new byte[256];

        for (int i = 0; i < 256; i++) {
            state[i] = (byte) i;
        }
        int index1 = 0;
        int index2 = 0;
        if (b_key == null || b_key.length == 0) {
            return null;
        }
        for (int i = 0; i < 256; i++) {
            index2 = ((b_key[index1] & 0xff) + (state[i] & 0xff) + index2) & 0xff;
            byte tmp = state[i];
            state[i] = state[index2];
            state[index2] = tmp;
            index1 = (index1 + 1) % b_key.length;
        }
        return state;
    }

    private static String toHexString(String s) {
        String str = "";
        for (int i = 0; i < s.length(); i++) {
            int ch = (int) s.charAt(i);
            String s4 = Integer.toHexString(ch & 0xFF);
            if (s4.length() == 1) {
                s4 = '0' + s4;
            }
            str = str + s4;
        }
        return str;// 0x表示十六进制
    }

    private static byte[] HexString2Bytes(String src) {
        int size = src.length();
        byte[] ret = new byte[size / 2];
        byte[] tmp = src.getBytes();
        for (int i = 0; i < size / 2; i++) {
            ret[i] = uniteBytes(tmp[i * 2], tmp[i * 2 + 1]);
        }
        return ret;
    }

    private static byte uniteBytes(byte src0, byte src1) {
        char _b0 = (char) Byte.decode("0x" + new String(new byte[]{src0})).byteValue();
        _b0 = (char) (_b0 << 4);
        char _b1 = (char) Byte.decode("0x" + new String(new byte[]{src1})).byteValue();
        byte ret = (byte) (_b0 ^ _b1);
        return ret;
    }

    private static byte[] RC4Base(byte[] input, String mKkey) {
        int x = 0;
        int y = 0;
        byte key[] = initKey(mKkey);
        int xorIndex;
        byte[] result = new byte[input.length];

        for (int i = 0; i < input.length; i++) {
            x = (x + 1) & 0xff;
            y = ((key[x] & 0xff) + y) & 0xff;
            byte tmp = key[x];
            key[x] = key[y];
            key[y] = tmp;
            xorIndex = ((key[x] & 0xff) + (key[y] & 0xff)) & 0xff;
            result[i] = (byte) (input[i] ^ key[xorIndex]);
        }
        return result;
    }
    public static void main(String[] args) {

    }
}
     

你可能感兴趣的:(免签支付)