ThinkPHP调用连连支付

1.配置环境

ip域名申请

 ip域名审核

 ip域名填写

 

 安全中心

 商户公钥维护

 

2.编写代码

*注意,一定要验签

*注意,一定要验签

文章中有的地方没有验签,但是自己根据需要一定要加上(安全第一)

<?php
namespace Service\Controller;

use Base\Webbase;


/**
 *汉字转变为utf8编码
 */
function chinesetoutf8($a=null){
    $a = iconv("gb2312","utf-8",$a);
    return $a;
}
/*
 * 验证 webhooks 签名方法
 */
function verify_signature($raw_data, $signature, $pub_key_path) {
    $pub_key_contents = file_get_contents($pub_key_path);
    // php 5.4.8 以上,第四个参数可用常量 OPENSSL_ALGO_SHA256
    return openssl_verify($raw_data, base64_decode($signature), $pub_key_contents, 'sha256');
}


class PayController extends Webbase {

    public function _initialize()
    {
        parent::_initialize();
        Vendor('Llpay.lib.llpay_core');
        Vendor('Llpay.lib.llpay_md5');
        Vendor('Llpay.lib.llpay_rsa');
        Vendor('Llpay.lib.llpay_cls_json');
        Vendor('Llpay.lib.llpay_notify');
        Vendor('Llpay.lib.llpay_submit');


        Vendor('Llpay.lib.tixian.llpay_security');
        Vendor('Llpay.lib.tixian.llpay_apipost_submit');
    }

    public function dollpay($data)
    {

        //商户用户唯一编号
        $user_id = $data['uid'];
        $bank = M('bankcard')->where(array('uid'=>$this->uid))->find();
        $userinfo = M('user_info')->where(array('uid'=>$this->uid))->find();

        //支付类型     虚拟商品:101001 实物商品:109001 账户充值:108001
        //$busi_partner = $data['busi_partner'];
        $busi_partner = 101001;

        //商户订单号
        $no_order = $data['order_id'];        //商户网站订单系统中唯一订单号,必填


        //付款金额
        $money_order = $data['amount']/100;

        //商品名称
        $name_goods = $data['name_goods'];

        //订单描述
        $info_order = $data['info_order'];
 

        /**********************************************/
        //卡号
        $card_no = $bank['card_number'];

        //姓名
        $acct_name = $userinfo['name'];

        //身份证号
        $id_no = $userinfo['idcard'];


        //协议号
        $no_agree = $data['no_agree'];

        /*************************************************/

        //风险控制参数
//        $risk_item = $data['risk_item'];
        //  $risk_item = '{\"user_info_bind_phone\":\"17358695911\",\"user_info_dt_register\":\"2013100122130\",\"risk_state\":\"1\",\"frms_ware_category\":\"1019\"}';
        $user = M('user')->where(array('uid'=>$user_id))->find();

        $userinfo = M('user_info')->where(array('uid'=>$user_id))->find();

        $risk_item = '{\"frms_ware_category\":\"1018\",\"user_info_mercht_userno\":\"2018109002237008\",\"user_info_bind_phone\":\"'.$user['mobile'].'\",\"user_info_dt_register\":\"'.date('YmdHis', $user['reg_time']).'\",\"user_info_full_name\":\"'.$userinfo['name'].'\",\"user_info_id_no\":\"'.$userinfo['idcard'].'\",\"user_info_identify_state\":\"1\",\"user_info_identify_type\":\"3\",}';


        //订单有效期 分钟为单位,默认为10080分钟(7天)
        $valid_order = 10080;

        //服务器异步通知页面路径
        $notify_url = "http://www.***.com/index.php/**/**/notifyurl";
        //需http://格式的完整路径,不能加?id=123这类自定义参数

        //页面跳转同步通知页面路径
        $return_url = "http://www.***.com/index.php/**/**/returnurl";
        //需http://格式的完整路径,不能加?id=123这类自定义参数,不能写成http://localhost/

        /************************************************************/

        //构造要请求的参数数组,无需改动
        $parameter = array (
            "oid_partner" => C('llpay_config.oid_partner'),
            "app_request" => C('llpay_config.app_request'),
            "sign_type" => C('llpay_config.sign_type'),
            "valid_order" => C('llpay_config.valid_order'),
            "user_id" => $user_id,
            "busi_partner" => $busi_partner,
            "no_order" => $no_order,
            "dt_order" => local_date('YmdHis', time()),
            //"dt_order" =>time(),
            "name_goods" => $name_goods,
            "info_order" => $info_order,
            "money_order" => $money_order,
            "notify_url" => $notify_url,
            "url_return" => $return_url,
            "card_no" => $card_no,
            "acct_name" => $acct_name,
            "id_no" => $id_no,
            "no_agree" => $no_agree,
            "risk_item" => $risk_item,
            "valid_order" => $valid_order
        );
        $llpay_config = C('llpay_config');
        //建立请求
        $llpaySubmit = new \LLpaySubmit($llpay_config);

        $html_text = $llpaySubmit->buildRequestForm($parameter, "post", "确认");
        echo $html_text;


    }
    /******************************
    服务器异步通知页面方法
    其实这里就是将notify_url.php文件中的代码复制过来进行处理
     *******************************/
    public function notifyurl()
    {
        $llpay_config = C('llpay_config');
        //计算得出通知验证结果
        $llpayNotify = new \LLpayNotify($llpay_config);
        $llpayNotify->verifyNotify();
        if ($llpayNotify->result) { //验证成功
            //获取连连支付的通知返回参数,可参考技术文档中服务器异步通知参数列表
            $no_order = $llpayNotify->notifyResp['no_order'];//商户订单号
            $oid_paybill = $llpayNotify->notifyResp['oid_paybill'];//连连支付单号
            $result_pay = $llpayNotify->notifyResp['result_pay'];//支付结果,SUCCESS:为支付成功
            $money_order = $llpayNotify->notifyResp['money_order'];// 支付金额
            if($result_pay == "SUCCESS"){
                    //请在这里加上商户的业务逻辑程序代(更新订单状态、入账业务)
                //——请根据您的业务逻辑来编写程序——
                if($result_pay == "SUCCESS"){
                    //请在这里加上商户的业务逻辑程序代(更新订单状态、入账业务)
                    //——请根据您的业务逻辑来编写程序——
                   
                    //payAfter($llpayNotify->notifyResp);
                }
                //payAfter($llpayNotify->notifyResp);
            }
            file_put_contents("log.txt", "异步通知 验证成功\n", FILE_APPEND);
            die("{'ret_code':'0000','ret_msg':'交易成功'}"); //请不要修改或删除
            /
        } else {
            file_put_contents("log.txt", "异步通知 验证失败\n", FILE_APPEND);
            //验证失败
            die("{'ret_code':'9999','ret_msg':'验签失败'}");
            //调试用,写文本函数记录程序运行情况是否正常
            //logResult("这里写入想要调试的代码变量值,或其他运行的结果记录");
            file_put_contents("log.txt", "异步通知 验证失败1\n", FILE_APPEND);
        }

    }

    /*
    页面跳转处理方法;
    这里其实就是将return_url.php这个文件中的代码复制过来,进行处理;
    */
    public function returnurl()
    {


        $llpay_config = C('llpay_config');
        //计算得出通知验证结果
        $llpayNotify = new \LLpayNotify($llpay_config);
        $verify_result = $llpayNotify->verifyReturn();
        if($verify_result) {//验证成功
            /
            //请在这里加上商户的业务逻辑程序代码

            //——请根据您的业务逻辑来编写程序(以下代码仅作参考)——
            //获取连连支付的通知返回参数,可参考技术文档中页面跳转同步通知参数列表
            $json = new \JSON;

            $res_data = $_POST["res_data"];



            //商户编号
            $oid_partner = $json->decode($res_data)-> {'oid_partner' };

            //商户订单号
            $no_order = $json->decode($res_data)-> {'no_order' };

            //支付结果
            $result_pay =  $json->decode($res_data)-> {'result_pay' };

            if($result_pay == 'SUCCESS') {
                header("location:http://www.yixianglife.com/yxlife_new/wx_web/index.html#/my") ;
                //判断该笔订单是否在商户网站中已经做过处理
                //如果没有做过处理,根据订单号(no_order)在商户网站的订单系统中查到该笔订单的详细,并执行商户的业务程序
                //如果有做过处理,不执行商户的业务程序
            }
            else {
                echo "result_pay=".$result_pay;
            }

            echo "验证成功<br />";

            //——请根据您的业务逻辑来编写程序(以上代码仅作参考)——

            /
        }
        else {
            //验证失败
            //如要调试,请看llpay_notify.php页面的verifyReturn函数
            echo "验证失败";
        }

        header("location:http://www.**.com") ;
    }



    /**
     * 付款接口
     * @param $data
     */
    public function payment($data)
    {

   

        //商户付款流水号
       
        $no_order = $data['orderid'];

        //商户时间
        $dt_order = date("YmdHis",time());

        //金额
        $money_order = $data['amount']/100;

        //收款人姓名  
        $acct_name= $data['acct_name'];

        //银行账号
        $card_no = $data['card_number'];

        //订单描述
        $info_order =  $data['info'];

        //对私标记
        $flag_card = '0';

        //服务器异步通知地址
        $notify_url = 'http://www.**.com/index.php/**/**/tx_notifyurl';

        //平台来源
        $platform = '**.com';

        //版本号
        $api_version = '1.0';


        //实时付款交易接口地址
        $llpay_payment_url = 'https://instantpay.lianlianpay.com/paymentapi/payment.htm';
        //需http://格式的完整路径,不能加?id=123这类自定义参数
    
        /************************************************************/
        $llpay_config = C('llpay_tx_config');
        //构造要请求的参数数组,无需改动
        $parameter = array (
            "oid_partner" => trim($llpay_config['oid_partner']),
            "sign_type" => trim($llpay_config['sign_type']),
            "no_order" => $no_order,
            "dt_order" => $dt_order,
            "money_order" => $money_order,
            "acct_name" => $acct_name,
            "card_no" => $card_no,
            "info_order" => $info_order,
            "flag_card" => $flag_card,
            "notify_url" => $notify_url,
            "platform" => $platform,
            "api_version" => $api_version
        );

        //建立请求
        $llpaySubmit = new \LLpaytxSubmit($llpay_config);

        //对参数排序加签名
        $sortPara = $llpaySubmit->buildRequestPara($parameter);
        //传json字符串
        $json = json_encode($sortPara);

        $parameterRequest = array (
            "oid_partner" => trim($llpay_config['oid_partner']),
            "pay_load" => ll_encrypt($json,$llpay_config['LIANLIAN_PUBLICK_KEY']) //请求参数加密
        );
        $html_text = $llpaySubmit->buildRequestJSON($parameterRequest,$llpay_payment_url);
//调用付款申请接口,同步返回0000,是指创建连连支付单成功,订单处于付款处理中状态,最终的付款状态由异步通知告知
//出现1002,2005,4006,4007,4009,9999这6个返回码时或者没返回码,
//抛exception(或者对除了0000之后的code都查询一遍查询接口)调用付款结果查询接口,明确订单状态,不能私自设置订单为失败状态,以免造成这笔订单在连连付款成功了,
//而商户设置为失败,用户重新发起付款请求,造成重复付款,商户资金损失

//对连连响应报文内容需要用连连公钥验签

        $arr = json_decode($html_text,true);
        return $arr;
/*********************************************************************************/
         /*if ($res['ret_code'] =="0000"){         
            $this->websuccess(self::OUTPUT_SUCCESS,'提现成功');    
            }else{  
            file_put_contents("./tx.log",json_encode($res));
            $this->weberror(self::THIS_ACTION_ERROR,'提现失败'.$res['ret_msg']);
        }
/*********************************************************************************/
    }
 

    /**
     * 付款结果查询
     * @param $data
     */
     public function queryPayment($data)   
    {
        $data = $_POST;       
        $url ="https://instantpay.lianlianpay.com/paymentapi/queryPayment.htm";
        $parameterRequest = array (
            'oid_partner' =>$data['oid_partner'],
            'sign'=>$data['sign'],
            'sign_type'=>$data['sign_type'],
            'no_order'=>$data['no_order'],
            'api_version'=>'1.0'
        );

        $result = getHttpResponseJSON($url,$parameterRequest);
        //$result = json_decode($result);
        var_dump($result);
        if ($result['result_pay'] =='success')
        {            
             return true;
        }else{
             return false;           
        }
    }



   

    









}

 

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值