1. 程式人生 > >快充寶接入

快充寶接入

快充寶


單收款碼處理,需要輸入金額和備註

<?php
namespace app\index\controller;

use think\Controller;
use think\Db;

class Miaochongbao extends Controller
{
    function return () {
        # 使用前提
        #
        #    1、支付寶掃描給你的二維碼,申請收錢碼,儲存到手機相簿。
        #    2、登陸入口 介面地址下面 支付寶重新整理時間修改為12000 儲存配置
        #    3、開始執行下面開通商戶。
        #    4、支付寶開始執行下面,設定自動登陸 。
        #    5、然後同時勾選受限12345(最新版本支援多選迴圈)勾選補單 選擇時間 補單下。

        #    受限3必須開通商戶,受限45必須申請收錢碼

        # 軟體填寫地址
        # http://你的域名/index/xxxx/return?name=#name&tno=#tno&money=#money&sign=#sign&key=123456789
        $order_sn   = trim(input('name')); # 支付備註name,可以是uid或者order_sn
        if (empty($order_sn)) {
        	exit();
        }
        $tno        = input('tno');
        $real_money = input('money'); # 交易支付金額
        $sign       = input('sign'); # 對比用
        $key        = input('key'); # 對比用
        # 其他
        $typ  = input('typ'); // 1手工 2支付寶 3財付通 4手機QQ  5微信
        $isSg = input('isSg'); // 1軟體人工介面提交 0軟體檢測自動提交
        $isQr = input('isQr'); // 1二維碼掃描 0直接轉賬
        # 驗證
        $key        = '123456789'; # 軟體上和網站加密串設定儲存一致
        $MD5_str    = 'md5key123'; # 軟體上和網站加密串設定儲存一致
        $check_sign = md5($tno . $order_sn . $real_money . $MD5_str); # MD5(tno+payno+money+md5加密串)
        # 常見介面
        # http://你的域名/index.php/Server/jfb_pay?name=#name&money=#money&tradeNo=#tno&sign=#sign&key=軟體識別金鑰 成功返回值1
        # http://你的域名/index.php/Lerver/lxcz_pay?name=#name&money=#money&ddh=#tno&sign=#sign&key=軟體識別金鑰 成功返回值1
        # http://你的域名/index.php/Server/jfb_pay?name=#name&money=#money&ddh=#tno&sign=#sign&key=軟體識別金鑰  成功返回值ok
        # http://你的域名/pay/post.php|POST|name=#name&ddh=#tno&money=#money&sign=#sign&key=軟體KEY  成功返回值okokokokokok或ok
        $info = [
            'order_sn'   => $order_sn,
            'tno'        => $tno,
            'real_money' => $real_money,
            'sign'       => $sign,
            'key'        => $key,
            'typ'        => $typ,
            'isSg'       => $isSg,
            'isQr'       => $isQr,
            'time'       => date('Y/m/d H:i:s'),
        ];
        # 判斷
        if ($check_sign == $sign) {
            $order_info = Db::table('nt_order')->where('order_sn', $order_sn)->find();
            if (empty($order_info)) {
                $info['bz'] = '訂單不存在';
                $log        = json_encode($info, JSON_UNESCAPED_UNICODE);
                Db::table('nt_test')->insert(['text' => $log]);
                echo '0';
                exit();
            }
            if ($order_info['is_pay'] == 1) {
                $info['bz'] = '已經支付';
                $log        = json_encode($info, JSON_UNESCAPED_UNICODE);
                Db::table('nt_test')->insert(['text' => $log]);
                echo '0';
                exit();
            }
            if ($real_money != $order_info['price']) {
                $info['bz'] = '訂單金額不對';
                $log        = json_encode($info, JSON_UNESCAPED_UNICODE);
                Db::table('nt_test')->insert(['text' => $log]);
                echo '0';
                exit();
            }
            $data = [
                'is_pay'   => 1,
                'pay_time' => date('Y/m/d H:i:s'),
            ];
            $is_updata = Db::table('nt_order')->where('order_sn', $order_sn)->update($data);
            if ($is_updata) {
                # 使用者處理
                Db::table('nt_users')->where('id', $order_info['uid'])->setInc('money_total', $order_info['money']);
                $book = new \app\index\controller\Book();
                $book->money_log($order_info['uid'], $order_info['money'], 1);
                echo '1';
                exit();
            } else {
                $info['bz'] = '更新失敗';
                $log        = json_encode($info, JSON_UNESCAPED_UNICODE);
                Db::table('nt_test')->insert(['text' => $log]);
                echo '0';
                exit();
            }
        } else {
            $info['bz'] = '驗證簽名失敗';
            $log        = json_encode($info, JSON_UNESCAPED_UNICODE);
            Db::table('nt_test')->insert(['text' => $log]);
            echo '0';
            exit();
        }
    }
}


多收款碼處理,無需備註和輸入金額

<?php
namespace app\index\controller;

use think\Controller;
use think\Db;

/**
# 軟體上:支付寶[賬號1] 收款碼:任意金額 填寫金額:999999 二維碼說明是收款 然後二維碼上傳
# 軟體上:依次上傳自己的 固定金額收款碼 選中上傳(網站上:掃碼應用->二維碼圖片資料 看得到)
# 網站上:繫結支付域名 自己的域名解析到 服務商的:xgpay1.mcbpay.com
# 網站上:掃碼應用->二維碼圖片資料->把二維碼上線 所在金額上線
# 其他
# 二維碼建立上傳方法
# 1、登入軟體 二維碼設定 設定APPID  (APPID APPKEY 到網站上 掃碼應用裡面找)
# 2、軟體上 二維碼設定 下面金額組裡面輸入常用金額 如100,500,1000,2000,999999 點批量新增
#    多個金額逗號隔開 其中999999是任意金額
# 3、建立後 雙擊記錄 選擇對應金額的二維碼圖片上傳 其中999999使用不設定金額的二維碼上傳
# 4、網站上 掃碼應用 二維碼圖片資料 把已經上傳的二維碼設定上線#
#
# 二維碼圖片更換方法
# 1、軟體上 二維碼設定 清空本地二維碼資料
# 2、網站上 掃碼應用 二維碼圖片資料 刪除二維碼圖片
# 3、軟體上 二維碼設定 重新建立上傳二維碼
# 4、網站上 掃碼應用 二維碼圖片資料 上線二維碼
# 5、軟體上 登入新的支付寶,微信的重新獲取快取碼
 */
<?php
return [
    'appid'  => '666',
    'appkey' => '666',
    'payurl' => 'www.666.net',
];
class Saomapay extends Controller
{
    /**
     * 收款碼支付 非同步回撥
     * @return [type] [description]
     */
    public function apipay()
    {
        // 測試
        // $log        = json_encode($_REQUEST, JSON_UNESCAPED_UNICODE);
        // Db::table('nt_test')->insert(['text' => $log]);
        //軟體介面配置
        $key_   = "666"; //介面KEY  自己修改下 軟體上和這個設定一樣就行
        $md5key = "666"; //MD5加密字串 自己修改下 軟體上和這個設定一樣就行
        # 這裡填寫:http://feibao.luhong421.com/index/Saomapay/apipay?name=#name&tno=#tno&money=#money&sign=#sign&key=123456789
        //軟體介面地址 http://域名/mcbpay/apipay.php?payno=#name&tno=#tno&money=#money&sign=#sign&key=介面KEY
        $getkey = input('key'); //接收引數key
        $tno    = input('tno'); //接收引數tno 交易號
        $payno  = input('name'); //接收引數payno 一般是使用者名稱 使用者ID 單號
        $money  = input('money'); //接收引數money 付款金額
        $sign   = input('sign'); //接收引數sign
        $typ    = (int) input('typ'); //接收引數typ
        $info   = [
            'order_sn'   => $payno,
            'tno'        => $tno,
            'real_money' => $money,
            'sign'       => $sign,
            'typ'        => $typ,
            'time'       => date('Y/m/d H:i:s'),
        ];
        if ($typ == 1) {
            $typname = '手工充值';
        } else if ($typ == 2) {
            $typname = '支付寶充值';
        } else if ($typ == 3) {
            $typname = '財付通充值';
        } else if ($typ == 4) {
            $typname = '手Q充值';
        } else if ($typ == 5) {
            $typname = '微信充值';
        }
        if (!$tno) {
            $info['bz'] = '沒有訂單號';
            $log        = json_encode($info, JSON_UNESCAPED_UNICODE);
            Db::table('nt_test')->insert(['text' => $log]);
            exit('沒有訂單號');
        }
        if (!$payno) {
            $info['bz'] = '沒有付款說明';
            $log        = json_encode($info, JSON_UNESCAPED_UNICODE);
            Db::table('nt_test')->insert(['text' => $log]);
            exit('沒有付款說明');
        }
        if ($getkey != $key_) {
            $info['bz'] = 'KEY錯誤';
            $log        = json_encode($info, JSON_UNESCAPED_UNICODE);
            Db::table('nt_test')->insert(['text' => $log]);
            exit('KEY錯誤');
        }
        if (strtoupper($sign) != strtoupper(md5($tno . $payno . $money . $md5key))) {
            $info['bz'] = '簽名錯誤';
            $log        = json_encode($info, JSON_UNESCAPED_UNICODE);
            Db::table('nt_test')->insert(['text' => $log]);
            exit('簽名錯誤');
        }
        //************以下程式碼自己寫
        //查詢資料庫 交易號tno是否存在  tno資料庫充值表增加個欄位 長度50 存放交易號
        //已經存在輸出 存在  交易號唯一
        //不存在 查詢使用者是否存在
        //使用者存在 增加使用者充值記錄 寫入交易號
        //給使用者增加金額
        //處理成功 輸出1
        # 使用者處理
        $order_info = Db::table('nt_order')->where('order_sn', $payno)->find();
        if (empty($order_info)) {
            $info['bz'] = '訂單不存在';
            $log        = json_encode($info, JSON_UNESCAPED_UNICODE);
            Db::table('nt_test')->insert(['text' => $log]);
            exit('訂單不存在');
        }
        if ($order_info['is_pay'] == 1) {
            $info['bz'] = '已經付款';
            $log        = json_encode($info, JSON_UNESCAPED_UNICODE);
            Db::table('nt_test')->insert(['text' => $log]);
            exit('已經付款');
        }
        $data = [
            'is_pay'   => 1,
            'pay_time' => date('Y/m/d H:i:s'),
        ];
        $is_updata = Db::table('nt_order')->where('order_sn', $payno)->update($data);
        Db::table('nt_users')->where('id', $order_info['uid'])->setInc('money_total', $order_info['money']);
        $book = new \app\index\controller\Book();
        $book->money_log($order_info['uid'], $order_info['money'], 1);
        exit('1');
    }
    /**
     * 掃碼應用支付 同步回撥
     * 最好填寫到 網站裡面 不要使用get_code()裡面的back_url
     * @return [type] [description]
     */
    public function back_url()
    {
        //支付成功跳轉頁面
        //************************
        $myappid = config('miaochong.appid'); //您的APPID
        $appkey  = config('miaochong.appkey'); //您的APPKEY
        //***********************
        if (!isset($_REQUEST['appid']) || !isset($_REQUEST['tno']) || !isset($_REQUEST['payno']) || !isset($_REQUEST['money']) || !isset($_REQUEST['typ']) || !isset($_REQUEST['paytime']) || !isset($_REQUEST['sign'])) {
            $info['bz'] = '引數錯誤';
            $log        = json_encode($info, JSON_UNESCAPED_UNICODE);
            Db::table('nt_test')->insert(['text' => $log]);
            exit('引數錯誤');
        }
        $appid   = (int) $_REQUEST['appid'];
        $tno     = $_REQUEST['tno']; //交易號 支付寶 微信 財付通 的交易號
        $payno   = $_REQUEST['payno']; //網站充值的使用者名稱 備註
        $money   = $_REQUEST['money']; //付款金額
        $typ     = (int) $_REQUEST['typ'];
        $paytime = $_REQUEST['paytime'];
        $sign    = $_REQUEST['sign'];
        $info    = [
            'order_sn'   => $payno,
            'tno'        => $tno,
            'real_money' => $money,
            'sign'       => $sign,
            'typ'        => $typ,
            'time'       => date('Y/m/d H:i:s'),
        ];
        if (!$appid || !$tno || !$payno || !$money || !$typ || !$paytime || !$sign) {
            $info['bz'] = '引數錯誤';
            $log        = json_encode($info, JSON_UNESCAPED_UNICODE);
            Db::table('nt_test')->insert(['text' => $log]);
            exit('引數錯誤');
        }
        if ($myappid != $appid) {
            $info['bz'] = 'appid error';
            $log        = json_encode($info, JSON_UNESCAPED_UNICODE);
            Db::table('nt_test')->insert(['text' => $log]);
            exit('appid error');
        }
        //sign 校驗
        if ($sign != md5($appid . "|" . $appkey . "|" . $tno . "|" . $payno . "|" . $money . "|" . $paytime . "|" . $typ)) {
            $info['bz'] = '簽名錯誤';
            $log        = json_encode($info, JSON_UNESCAPED_UNICODE);
            Db::table('nt_test')->insert(['text' => $log]);
            exit('簽名錯誤');
        }
        //處理使用者充值
        if ($typ == 1) {
            $typname = '手工充值';
        } else if ($typ == 2) {
            $typname = '支付寶充值';
        } else if ($typ == 3) {
            $typname = '財付通充值';
        } else if ($typ == 4) {
            $typname = '手Q充值';
        } else if ($typ == 5) {
            $typname = '微信充值';
        }
        if (!$tno) {
            $info['bz'] = '沒有訂單號';
            $log        = json_encode($info, JSON_UNESCAPED_UNICODE);
            Db::table('nt_test')->insert(['text' => $log]);
            exit('沒有訂單號');
        }
        if (!$payno) {
            $info['bz'] = '沒有付款說明';
            $log        = json_encode($info, JSON_UNESCAPED_UNICODE);
            Db::table('nt_test')->insert(['text' => $log]);
            exit('沒有付款說明');
        }
        //************以下程式碼自己寫
        //查詢資料庫 交易號tno是否存在  tno資料庫充值表增加個欄位 長度50 存放交易號
        //已經存在輸出 存在 跳轉到充值記錄或其他頁面 交易號唯一
        //不存在 查詢使用者是否存在
        //使用者存在 增加使用者充值記錄 寫入交易號
        //給使用者增加金額
        //處理成功
        $this->success('支付結果請等待檢視!');
    }
    /**
     * 給使用者掃描的地址,二維碼圖片
     * 採用直接跳轉:(方法四)
     * 支付域名是軟體提供商提供的 name解析到xgpay1.mcbpay.com
     * 跳轉地址(給使用者掃描的地址):http://支付域名/pay/pay.php?appid=您的APPID&payno=網站付款說明&typ=支付方式&money=支付金額&back_url=成功返回地址
     * 引數:appid=掃碼應用的APPID
     * 引數:payno=網站使用者付款說明 一般是使用者名稱或者使用者ID 訂單號等 付款後返回給軟體
     * 引數:typ=支付方式 1=支付寶轉賬備註 2=支付寶掃碼 3=財付通 4=手機QQ支付 5=微信支付
     * 引數:money=付款金額
     * 引數:pt=pc 強制顯示PC端頁面 pt=wap 強制顯示手機頁面
     * 引數:back_url=成功返回地址 http://域名/頁面 需要進行URL編碼 php:urlencode() asp:Server.URLEncode() js:encodeURIComponent() 不設定這個引數時呼叫掃描應用裡面的成功返回地址
     * @return [type] [description]
     */
    public function get_code($order_sn)
    {
        if (empty($order_sn)) {
            $this->error('訂單不存在');
        }
        $order_info = Db::table('nt_order')->where('order_sn', $order_sn)->find();
        if (empty($order_info)) {
            $this->error('訂單不存在');
        }
        $qrcode   = new Qrcode();
        $order_sn = $order_info['order_sn'];
        $money    = $order_info['price'];
        // $back_url = urlencode("http://feibao.luhong421.com/index/saomapay/back_url"); // 可能會被伺服器遮蔽,所以進 網站 配置
        $appid = config('miaochong.appid');
        # typ=支付方式 1=支付寶轉賬備註 2=支付寶掃碼 3=財付通 4=手機QQ支付 5=微信支付
        $shop = new Shop();
        if ($shop->is_weixin()) {
            $typ = 5;
        } else {
            $typ = 2;
        }
        $payurl = config('miaochong.payurl');
        $text   = "http://{$payurl}:9999/pay/pay.php?appid={$appid}&payno={$order_sn}&typ={$typ}&money={$money}";
        $qrcode->make_arcode($text, 0, 0);
    }
    /**
     * 直接進行跳轉支付
     * @return [type] [description]
     */
    public function redirect_codeurl($roder_id, $pay_type)
    {
        $order_id   = input('order_id');
        $pay_type   = input('pay_type');
        $order_info = Db::table('nt_order')->where('id', $order_id)->find();
        if (empty($order_info)) {
            $this->error('訂單不存在');
        }
        $payurl   = config('miaochong.payurl');
        $appid    = config('miaochong.appid');
        $order_sn = $order_info['order_sn'];
        $money    = $order_info['price'];
        if ($pay_type == 1) {
            $typ = 5; // 微信
        } else {
            $typ = 2;
        }
        $url = "http://{$payurl}:9999/pay/pay.php?appid={$appid}&payno={$order_sn}&money={$money}&typ={$typ}";
        $this->redirect($url);
    }
}