支付狗接口说明 修改教程

功能需要使用一个安卓手机安装“支付狗app” 进行收款到账监控

APP如何使用? 点击这里查看: http://jsrun.net/tutorial/MgKKp

支付狗 接口说明

所有接口交互中,关键信息全都为密文传输

创建订单接口

类型 主动调用平台
方式 POST 表单模式提交
接口地址 http://pay.dogpay.cn/pay/createOrder
参数 appId=商户号&data=(加密内容)
加密内容 { "payMethod":"alipay", "amount":"1.00", "orderSn":"你的订单标识,任意字符串", "goodsName":"你的商品名称","returnUrl":"支付成功后,自动跳转地址"}
其中参数 payMethod 可传 "alipay" 、 "wxpay" 选择支付方式
加密方式 见本说明末尾
返回结果 {error: 0, msg: null, data: "http://pay.dogpay.cn/pay/order/(这是一个跳转地址)"} , 将网页跳转到 data 参数中URL让用户进行付款。

说明: 调用创建订单接口传同一个订单号,系统会合理调度,不会重复挤占通道。

订单付款后回调

用户扫码付款成功后,平台会回调商户网站地址

如果商户站接口调用失败 (接口返回状态码200 即视为成功),系统会在 1分钟 10分钟 30分钟 发起3次重试, 接口返回data=(加密内容), 解密后为一个JSON字符串。

类型 平台调用商户网站接口
方式 POST 表单模式提交
接口地址 (需要在后台配置商户接口地址,如:http://yousite/pay/callback
参数 data=(加密内容)
加密内容 { "payMethod":"alipay", "amount":"1.00", "orderSn":"任意字符串", "goodsName":"你的商品名称","returnUrl":"支付成功后,自动跳转地址"}
解密方式 见本说明末尾

加解密

AES 128位,MCRYPT_MODE_CBC (AES/CBC/PKCS5Padding) 提供的商户秘钥一共32个字符, 取前16位做向量,取后16位做密码

php 加解密用法



class AESUtil {  
    //设置商户号
    const APP_ID = 22;
    // 请在这里设置你的商户密钥,将里面的XXX改成你自己的商户密钥
    private $key = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";  

    //加密
    public function encrypt($encryptStr) {
        $localIV =  substr($this->key,0,16);
        $encryptKey = substr($this->key,16,16); 
        $module = mcrypt_module_open(MCRYPT_RIJNDAEL_128, '', MCRYPT_MODE_CBC, $localIV);  
        mcrypt_generic_init($module, $encryptKey, $localIV); 
        $block = mcrypt_get_block_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC);
        $pad = $block - (strlen($encryptStr) % $block);  
        $encryptStr .= str_repeat(chr($pad), $pad); 
        $encrypted = mcrypt_generic($module, $encryptStr); 
        mcrypt_generic_deinit($module);
        mcrypt_module_close($module); 
        return urlencode(base64_encode($encrypted)); 
    }

    //解密 
    public function decrypt($encryptStr) {
        $localIV =  substr($this->key,0,16);
        $encryptKey = substr($this->key,16,16); 
        $module = mcrypt_module_open(MCRYPT_RIJNDAEL_128, '', MCRYPT_MODE_CBC, $localIV); 
        mcrypt_generic_init($module, $encryptKey, $localIV); 
        $data = mdecrypt_generic($module, base64_decode(urldecode($encryptStr)));
        $pos = strrpos($data, "}");
        $data = substr($data, 0, $pos + 1);
        return $data;
    }
}

// post 请求方法
function request_post($url = '', $post_data = array()) {
    if (empty($url) || empty($post_data)) {
        return false;
    }

    $o = "";
    foreach ( $post_data as $k => $v ) 
    { 
        $o.= "$k=" . urlencode( $v ). "&" ;
    }
    $post_data = substr($o,0,-1);

    $postUrl = $url;
    $curlPost = $post_data;
    $ch = curl_init();//初始化curl
    curl_setopt($ch, CURLOPT_URL,$postUrl);//抓取指定网页
    curl_setopt($ch, CURLOPT_HEADER, 0);//设置header
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);//要求结果为字符串且输出到屏幕上
    curl_setopt($ch, CURLOPT_POST, 1);//post提交方式
    curl_setopt($ch, CURLOPT_POSTFIELDS, $curlPost);
    $data = curl_exec($ch);//运行curl
    curl_close($ch);

    return $data;
}


//  ====================================
//       创建订单接口调用示例
//  ====================================
 function createOrder(){
    $aes = new AESUtil(); 
    // 请注意 orderSn 参数 要传你的订单号,不要每次都传一个相同的值
    $data= '{ "payMethod":"alipay", "amount":"1.00", "orderSn":"1001", "goodsName":"你的商品名称","returnUrl":"支付成功后,自动跳转地址"}';
    $encryptedData =  $aes->encrypt($data); 

    $url = 'http://pay.dogpay.cn/pay/createOrder';
    $post_data['appId']     = AESUtil::APP_ID ; //商户号
    $post_data['data']      =  $encryptedData;
    $res =  request_post($url, $post_data);      

    print_r($res); 
    // 返回结果类似于: {error: 0, msg: null, data: "http://pay.dogpay.cn/pay/order/(这是一个跳转地址)"} 
    // 需要读取其中的data字段 ,控制网页跳转到 data 参数中的URL让用户进行付款。
}


//  ====================================
//       支付成功回调 示例
//  ====================================

function  callback(){
    // 将以下代码放于  http://yoursite/callback  回调地址下直接调用
    $aes = new AESUtil(); 
    $data= $_REQUEST['data'];
    // $data = urlencode($data); //部份环境中,需要放开注释来运行这行代码
    $data = $aes->decrypt($data);
    $data = json_decode($data); 

    $data->id; // 订单流水号
    $data->orderSn;    // 返回createOrder接口调用时设置的订单号
    $data->amount;      //用户实付金额,可能会与订单金额有几分钱的偏差, 默认上下浮动2% (可设置)
    $data->displayAmount; // 订单金额
    $data->goodsName;    //商品名
    $data->createTime; //订单创建时间
    $data->completedTime;  //订单支付完成时间
    $data->buyer;      //对方支付宝账号(仅支付宝)
    $data->method;     //支付方式   
}

java 加解密代码

public class AESUtil  {  
    public static String encrypt(String content, String secret) {
        return encrypt(content, secret.substring(0,16),secret.substring(16));
    }

    /**
     * AES加密
     *
     * @param content  需要加密的内容
     * @param password 加密密码
     * @return
     */
    public static String encrypt(String content, String iv, String password) {
        try {
            byte[] byteContent = content.getBytes("utf-8");

            IvParameterSpec zeroIv = new IvParameterSpec(iv.getBytes());
            SecretKeySpec key = new SecretKeySpec(password.getBytes(), "AES");
            Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
            cipher.init(Cipher.ENCRYPT_MODE, key, zeroIv);
            byte[] result = cipher.doFinal(byteContent);
            BASE64Encoder base64 = new BASE64Encoder();
            return base64.encode(result);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

    public static String decrypt(String content, String secret) {
        return decrypt(content, secret.substring(0,16),secret.substring(16));
    }

    /**
     * 解密
     *
     * @param content  待解密内容
     * @param password 解密密钥
     * @return
     */
    public static String decrypt(String content, String iv, String password) {
        BASE64Decoder base64 = new BASE64Decoder();
        byte[] bytes;
        try {
            bytes = base64.decodeBuffer(content.trim());
            IvParameterSpec zeroIv = new IvParameterSpec(iv.getBytes());
            SecretKeySpec key = new SecretKeySpec(password.getBytes(), "AES");
            Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
            cipher.init(Cipher.DECRYPT_MODE, key, zeroIv);
            byte[] result = cipher.doFinal(bytes);
            return new String(result);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }
}

C#加解密代码

        #region ========在线支付加密解密========
        /// <summary>
        /// AES加密
        /// </summary>
        /// <param name="data">加密数据</param>
        /// <returns></returns>
        public static string AesEncrypt(string data)
        {
            string secretKey = "密钥";
            using (RijndaelManaged cipher = new RijndaelManaged())
            {
                cipher.Mode = CipherMode.CBC;
                cipher.Padding = PaddingMode.PKCS7;
                cipher.KeySize = 128;
                cipher.BlockSize = 128;
                cipher.IV = Encoding.UTF8.GetBytes(secretKey.Substring(0, 16));
                cipher.Key = Encoding.UTF8.GetBytes(secretKey.Substring(16, 16));
                byte[] valueBytes = Encoding.UTF8.GetBytes(data);
                byte[] encrypted;
                using (ICryptoTransform encryptor = cipher.CreateEncryptor())
                {
                    using (MemoryStream ms = new MemoryStream())
                    {
                        using (CryptoStream writer = new CryptoStream(ms, encryptor, CryptoStreamMode.Write))
                        {
                            writer.Write(valueBytes, 0, valueBytes.Length);
                            writer.FlushFinalBlock();
                            encrypted = ms.ToArray();
                            return System.Web.HttpUtility.UrlEncode(Convert.ToBase64String(encrypted));
                        }
                    }
                }
            }
        }
        /// <summary>
        /// AES解密
        /// </summary>
        /// <param name="data">解密数据</param>
        /// <returns>解密结果</returns>
        public static string AesDecrypt(string data)
        {
            string secretKey = "密钥";
            using (RijndaelManaged cipher = new RijndaelManaged())
            {
                cipher.Mode = CipherMode.CBC;
                cipher.Padding = PaddingMode.PKCS7;
                cipher.KeySize = 128;
                cipher.BlockSize = 128;
                cipher.IV = Encoding.UTF8.GetBytes(secretKey.Substring(0, 16));
                cipher.Key = Encoding.UTF8.GetBytes(secretKey.Substring(16, 16));
                byte[] lstBytes = Convert.FromBase64String(data);
                using (ICryptoTransform decryptor = cipher.CreateDecryptor())
                {
                    using (MemoryStream msDecrypt = new MemoryStream(lstBytes.ToArray()))
                    {
                        using (CryptoStream csDecrypt = new CryptoStream(msDecrypt, decryptor, CryptoStreamMode.Read))
                        {
                            using (StreamReader srDecrypt = new StreamReader(csDecrypt))
                            {
                                return srDecrypt.ReadToEnd();
                            }
                        }
                    }
                }
            }
        }
        #endregion

如果觉得JSRUN的教程对您有用,请随意打赏。您的支持将鼓励JSRUN继续提供更好的服务

捐助JSRUN
JSRUN前端教程共编系统是国内最先开创的教程维护系统, 所有工程师都可以参与共同维护的本前端教程,让知识的积累变得统一完整、自成体系。 希望广大工程师能一起参与进共编,让零散在世界各处的知识点找到组织、找到家。
X
支付宝
9.99
请使用支付宝扫码支付, 有效时间 5分0秒
超过有效时间后请立即停止支付。
支付故障请联系QQ:565830900
因10.00元通道已占用,系统建议您支付9.99元
正在生成二维码, 此过程可能需要15秒钟
谢谢支持,我一定会更加努力的