欢迎您, 来到 宁时修博客.^_^

【汇聚支付】php之快捷支付

2018/12/12 宁时修 php,thinkPHP 5.0,支付 866
汇聚支付是一家第三方支付平台,调用该平台提供的api来实现银行卡快捷支付

汇聚支付是一家第三方支付平台,你需要和他们达成合作才能调用该平台提供的api来实现银行卡快捷支付,一般这种支付官方都会demo来做参考,人家也有相应的技术支持对接。我之所以写,纯属是为了记录笔记。

1.首先申请支付

给个链接吧,https://www.joinpay.com/

2.填写必要的参数

这个我也相应做了一下简单的封装,只需要把下面复制便可用

<?php
class Pay
{
    /**
     * 初始化应用参数
     * Pay constructor.
     */
    public function __construct()
    {
        // 快捷支付的配置
        $this->fastPayConfig = [
            'hmacVal' => 'xxxxx',//商户秘钥
            'p1_MerchantNo' => 'xxxx',//商户号
            'p2_MerchantName' => 'xxxxx',//商户名称
            'q6_ReturnUrl' => 'xxxxx',//同步回调地址
            'q7_NotifyUrl' => 'xxxx', // 异步回调地址
        ];
    }
    
    /**
     * 快捷支付【汇聚支付】-去支付
     * @param string $subject 商品名称
     * @param string $order_sn 订单号
     * @param int $total_amount 充值金额
     * @param array $bankInfo 用户银行卡信息
     * @param array $code 短信验证码
     * @return bool|mixed|string
     */
    public function createShortcutPay($subject, $order_sn, $total_amount,$bankInfo, $code)
    {
        $params = $this->createCommonPackageSubPay($subject, $order_sn, $total_amount,$bankInfo,$code);
        // 验证签名 方式 MD5
        $params['hmac'] = urlencode($this->hmacRequest($params,$this->fastPayConfig['hmacVal']));
        // 支付请求接口
        $url = 'https://www.joinpay.com/trade/fastpayPayApi.action';
        $result = $this->http_post($url,$params);
        $res = json_decode($result,true);
        $codes = [100,102];
        if (in_array($res['ra_Status'],$codes)) {
            return $this->outJson(1,'支付成功');
        } else {
            return $this->outJson(0,$res['rb_Msg']);
        }
    }
    
    /**
     * 快捷支付【汇聚支付】- 发送短信验证码
     * @param string $subject 商品名称
     * @param string $order_sn 订单号
     * @param int $total_amount 充值金额
     * @param array $bankInfo 用户银行卡信息
     * @return bool|mixed|string
     */
    public function createShortcutSms($subject, $order_sn, $total_amount,$bankInfo)
    {
        $params = $this->createPaySms($subject, $order_sn, $total_amount,$bankInfo);
        // 验证签名 方式 MD5
        $params['hmac'] = urlencode($this->hmacRequest($params,$this->fastPayConfig['hmacVal']));
        // 支付请求接口
        $url = 'https://www.joinpay.com/trade/fastpaySmsApi.action';
        $result = $this->http_post($url,$params);
        $res = json_decode($result,true);
        if ($res['ra_Status'] == 100) {
            return $this->outJson(1,'支付短信验证码发送成功');
        } else {
            return $this->outJson(0,$res['rb_Msg']);
        }
    }
    
    /**
     * 快捷支付异步回调地址
     */
    public function shortcutPay()
    {
        $data = request()->param();
        // 记录日志查看 平台返回来的数据
        $this->log($data);
        // 成功回调后 会有相应的状态码 这个他们有文档说明
        // 验证签名成功后 修改订单状态等等...
    }
    
    protected function log($data){
        $log_file = ROOT_PATH . '/cache_data/pay.log';
        $content = var_export($data,true);
        $content .= "\r\n\n";
        file_put_contents($log_file,$content, FILE_APPEND);
    }
    
    
    /**
     * 创建快捷支付公共的信息
     * @param string $subject 商品名称
     * @param string $order_sn 订单号
     * @param int $total_amount 充值金额
     * @param array $bankInfo 用户银行卡信息
     * @param string $code 短信验证码
     * @return mixed
     */
    protected function createCommonPackageSubPay($subject, $order_sn, $total_amount,$bankInfo,$code)
    {
        $params['p0_Version'] = '2.0';
        // 商户编号
        $params['p1_MerchantNo'] = $this->fastPayConfig['p1_MerchantNo'];
        // 商户名称
        $params['p2_MerchantName'] = $this->fastPayConfig['p2_MerchantName'];
        // 商品订单号
        $params['q1_OrderNo'] = $order_sn;
        // 订单金额
        $params['q2_Amount'] = $total_amount;
        // 交易币种
        $params['q3_Cur'] = 1;
        // 商品名称
        $params['q4_ProductName'] = $subject;
        // 页面通知地址
        $params['q6_ReturnUrl'] = $this->fastPayConfig['q6_ReturnUrl'];
        // 异步通知地址
        $params['q7_NotifyUrl'] = $this->fastPayConfig['q7_NotifyUrl'];
        // 银行编码
        $params['q8_FrpCode'] = 'FAST';
        // 支付人姓名
        $params['s1_PayerName'] = $bankInfo['user_name'];
        // 支付人证件类型
        $params['s2_PayerCardType'] = 1;
        // 支付人证件号
        $params['s3_PayerCardNo'] = $bankInfo['id_card_num'];
        // 支付人银行卡号
        $params['s4_PayerBankCardNo'] = $bankInfo['bank_card_num'];
        // 银行预留手机号
        $params['s7_BankMobile'] = $bankInfo['phone'];
        // 短信验证码 (新增)
        $params['t2_SmsCode'] = $code;
        return $params;
    }
    
    
    /**
     * 组装快捷支付发送短信验证码参数
     * @param $order_sn
     * @param $total_amount
     * @param $subject
     * @param $bankInfo
     * @return mixed
     */
    protected function createPaySms($subject, $order_sn, $total_amount,$bankInfo)
    {
        $params['p0_Version'] ='2.0';
        //2.商户编号
        $params['p1_MerchantNo'] = $this->fastPayConfig['p1_MerchantNo'];
        //3.商户名 称
        $params['p2_MerchantName'] = $this->fastPayConfig['p2_MerchantName'];
        //6.商品订 单号
        $params['q1_OrderNo'] = $order_sn;
        //7.订单金额
        $params['q2_Amount'] =  $total_amount;
        //8.交易币 种
        $params['q3_Cur'] = 1;
        //9.商品名称
        $params['q4_ProductName'] = $subject;
        //12.异步通知 地址
        $params['q7_NotifyUrl'] = $this->fastPayConfig['q7_NotifyUrl'];
        //13.银行编码
        $params['q8_FrpCode'] = 'FAST';
        //15.支付人姓 名
        $params['s1_PayerName'] = $bankInfo['user_name'];
        //16.支付人证 件类型
        $params['s2_PayerCardType'] = 1;
        //17.支付人证 件号
        $params['s3_PayerCardNo'] = $bankInfo['id_card_num'];
        //18.支付人银行卡号
        $params['s4_PayerBankCardNo'] = $bankInfo['bank_card_num'];
        //21.银行预留 手机号
        $params['s7_BankMobile'] = $bankInfo['phone'];
        return $params;
    }
    
    
    /**
     * 生成签名
     * @param $params
     * @param $key
     * @param int $encryptType
     * @return string
     */
    protected function hmacRequest($params, $key, $encryptType = 1)
    {
        if ($encryptType == 1) {
            return md5(implode("", $params) . $key);
        } else {
            $private_key = openssl_pkey_get_private($key);
            $params = implode("", $params);
            openssl_sign($params, $sign, $private_key, OPENSSL_ALGO_MD5);
            openssl_free_key($private_key);
            $sign = base64_encode($sign);
            return $sign;
        }
    }
    
    
    /**
     * 模拟post请求
     * @param $url
     * @param $params
     * @param bool $contentType
     * @return bool|mixed|string
     */
    protected  function http_post($url, $params,$contentType=false)
    {
        if (function_exists('curl_init')) { // curl方式
            $oCurl = curl_init();
            if (stripos($url, 'https://') !== FALSE) {
                curl_setopt($oCurl, CURLOPT_SSL_VERIFYPEER, FALSE);
                curl_setopt($oCurl, CURLOPT_SSL_VERIFYHOST, FALSE);
            }
            $string = $params;
            if (is_array($params)) {
                $aPOST = array();
                foreach ($params as $key => $val) {
                    $aPOST[] = $key . '=' . urlencode($val);
                }
                $string = join('&', $aPOST);
            }
            curl_setopt($oCurl, CURLOPT_URL, $url);
            curl_setopt($oCurl, CURLOPT_RETURNTRANSFER, 1);
            curl_setopt($oCurl, CURLOPT_POST, TRUE);
            //$contentType json处理
            if($contentType){
                $headers = array(
                    "Content-type: application/json;charset='utf-8'",
                );
                curl_setopt($oCurl, CURLOPT_HTTPHEADER, $headers);
                curl_setopt($oCurl, CURLOPT_POSTFIELDS, json_encode($params));
            }else{
                curl_setopt($oCurl, CURLOPT_POSTFIELDS, $string);
            }
            $response = curl_exec($oCurl);
            curl_close($oCurl);
            return $response;
        } elseif (function_exists('stream_context_create')) { // php5.3以上
            $opts = array(
                'http' => array(
                    'method' => 'POST',
                    'header' => 'Content-type: application/x-www-form-urlencoded',
                    'content' => http_build_query($params),
                )
            );
            $_opts = stream_context_get_params(stream_context_get_default());
            $context = stream_context_create(array_merge_recursive($_opts['options'], $opts));
            return file_get_contents($url, false, $context);
        } else {
            return FALSE;
        }
    }
    
    
    /**
     * 输出json数组
     * @param int $code
     * @param string $msg
     * @param array $data
     * @return array
     */
    protected function outJson($code = 0, $msg = '', $data = [])
    {
        return [
            "status" => $code,
            "msg" =>  $msg,
            "data" => $data
        ];
    }
}

只需要把上述必要获得 填写 便可以实现

调用的时候,需要注意一下,如果你这边已经绑定好了银行卡那些信息,需要调用发送短信的接口 等用户获得验证码之后 前端再次请求去支付的接口便可以成功支付。支付成功后,平台会往你填写的异步回调地址 进行回调

记住哦,先调用发送短信的接口 等用户获得验证码 前端再次请求去支付接口即可。

点赞
说说你的看法

所有评论: (1)

# 加入组织

1、用手机QQ扫左侧二维码

2、搜Q群:1058582137

3、点击 宁时修博客交流群