PHP對接建行龍支付

前言

最近公司項目需要集成建行龍支付, 踩過一些坑之后, 在這里做個總結記錄一下

商戶下單接口

/**
 * 建行龍支付請求數(shù)據(jù)組裝
 * @param $orderNum
 * @param $price
 * @param $ip
 * @return array
 */
private function ccb($orderNum, $price, $ip)
{
    // 商戶代碼, 由建行統(tǒng)一分配
    $MERCHANTID = $this->MERCHANTID;
    // 商戶柜臺代碼, 由建行統(tǒng)一分配
    $POSID = $this->POSID;
    // 分行代碼, 由建行統(tǒng)一指定
    $BRANCHID = $this->BRANCHID;
    // 訂單號, 由商戶提供,最長 30 位
    $ORDERID = $orderNum;
    // 付款金額
    $PAYMENT = $price;
    // 幣種 01-人民幣
    $CURCODE = '01';
    // 交易碼, 由建行統(tǒng)一分配為 520100
    $TXCODE = '520100';
    // 備注 1, 一般作為商戶自定義備注信息使用瘾境,可在對賬單中顯示歧杏。
    $REMARK1 = '';
    // 備注 2, 一般作為商戶自定義備注信息使用,可在對賬單中顯示迷守。
    $REMARK2 = '';
    // 接口類型, 分行業(yè)務人員在 P2 員工渠道后臺設置防釣魚的開關犬绒。1-防釣魚接口
    $TYPE = 1;
    // 公鑰后 30 位, 商戶從建行商戶服務平臺下載,截取后 30 位兑凿。僅作為源串參加 MD5 摘要凯力,不作為參數(shù)傳遞
    $PUB = $this->PUB;
    // 網(wǎng)關類型, 默認送 0
    $GATEWAY = 0;
    // 客戶在商戶系統(tǒng)中的 IP,即客戶登陸(訪問)商戶系統(tǒng)時使用的 ip
    $CLIENTIP = $ip;
    // 客戶在商戶系統(tǒng)中注冊的信息礼华,中文需使用 escape 編碼
    $REGINFO = '';
    // 客戶購買的商品, 中文需使用 escape 編碼
    $PROINFO = '';
    // 商戶 URL, 商戶送空值即可
    $REFERER = '';
    // 商戶客戶端的intent?filter/schema, comccbpay+商戶代碼+商戶自定義的標示app的字符串(只能為字母或數(shù)字), 例comccbpay105320148140002alipay, 
    // 建行移動端文檔就要求這么拼接, IOS文檔卻直接寫取你的應用程序的URL Schemes即可, 你們自己看文檔要求吧
    // $THIRDAPPINFO = 'comccbpay' . $MERCHANTID. 'myAPP';
    $THIRDAPPINFO = 'myAPP';

    // 支付方式位圖, 10位位圖咐鹤,1為開,0為關, 第一位:支付寶, 第二位:微信,第三位:銀聯(lián)支付(保留位圣絮,暫不開放)其余位數(shù)預留祈惶。例如支持支付寶和微信支付則上送1100000000該字段不參與 MAC計算
    $PAYMAP = '0000000000';

    // md5加密參數(shù)
    $md5Params = [
        'MERCHANTID' => $MERCHANTID,
        'POSID' => $POSID,
        'BRANCHID' => $BRANCHID,
        'ORDERID' => $ORDERID,
        'PAYMENT' => $PAYMENT,
        'CURCODE' => $CURCODE,
        'TXCODE' => $TXCODE,
        'REMARK1' => $REMARK1,
        'REMARK2' => $REMARK2,
        'TYPE' => $TYPE,
        'PUB' => $PUB,
        'GATEWAY' => $GATEWAY,
        'CLIENTIP' => $CLIENTIP,
        'REGINFO' => $REGINFO,
        'PROINFO' => $PROINFO,
        'REFERER' => $REFERER,
        'THIRDAPPINFO' => $THIRDAPPINFO,
        // 'TIMEOUT' => ''
    ];
    $md5Query = http_build_query($md5Params);
    // MAC 校驗域, 采用標準 MD5 算法
    $MAC = md5($md5Query);

    // 請求參數(shù)
    $urlParams = [
        'MERCHANTID' => $MERCHANTID,
        'POSID' => $POSID,
        'BRANCHID' => $BRANCHID,
        'ORDERID' => $ORDERID,
        'PAYMENT' => $PAYMENT,
        'CURCODE' => $CURCODE,
        'TXCODE' => $TXCODE,
        'REMARK1' => $REMARK1,
        'REMARK2' => $REMARK2,
        'TYPE' => $TYPE,
        'GATEWAY' => $GATEWAY,
        'CLIENTIP' => $CLIENTIP,
        'REGINFO' => $REGINFO,
        'PROINFO' => $PROINFO,
        'REFERER' => $REFERER,
        'THIRDAPPINFO' => $THIRDAPPINFO,
        'MAC' => $MAC,
//            'PAYMAP' => '0000000000'
    ];

    $orderStr = http_build_query($urlParams);
    return [
       // 我這里只是返回url需要拼接的參數(shù), https://ibsbjstar.ccb.com.cn/CCBIS/ccbMain?加上$orderStr就是完整的商戶下單請求地址
        'orderStr' => $orderStr
    ];
}

特別注意:
①THIRDAPPINFO這個字段,該字段有值的情況下晨雳,系統(tǒng)會優(yōu)先調(diào)用手機銀行App進行支付行瑞,在手機銀行App未安裝的情況下才會進行H5頁面支付,因此需要將該字段值設置為你的應用程序的URL Schemes餐禁,否則支付成功后返回不到你的APP血久。
② 參數(shù)代碼:0130Z110C100表示MAC校驗不通過

商戶通知(支付回調(diào)通知)

登錄商戶服務平臺(即商戶網(wǎng)銀,具體路徑:商戶服務平臺-服務管理-實時反饋地址修改), 這里有個坑, 實時反饋地址不是馬上生效的, 文檔也沒說, 然后問了才知道反饋地址修改后需要退出商戶服務平臺帮非,然后再次登錄觸發(fā)同步氧吐,半個小時后再生效......我就不吐槽了。

接下來我們需要對建行傳過來的url參數(shù)做處理末盔,還要進行驗簽判斷筑舅。因為對方?jīng)]有提供php的驗簽demo,所以我選擇了他們提供的Socket驗簽jar包, 使用這個包需要下載java的運行環(huán)境(安裝jdk1.4及以上版本陨舱,配置jdk相關環(huán)境)

然后配置建行提供的配置文件:ccbnetpayconfig.xml

<?xml version="1.0" encoding="UTF-8"?>

<!-- 中國建設銀行商戶通知驗簽配置文件 -->

<ccbnetpayconfig>

    <!-- 通訊端口1024~65535之間未被使用的端口 -->
    <commport>
        <value>55533</value>
    </commport>

    <!-- 驗簽程序的線程數(shù) -->
    <maxconn>
        <value>5</value>
    </maxconn>

    <!-- 商戶若有多個柜臺翠拣,可按照不同的柜臺號配置不同的公鑰 -->
    <merpos>
        <!-- 商戶柜臺號 -->
        <posid>這里輸入你的商戶柜臺號</posid>
        <!-- 對應的公鑰 -->
        <pubkey>這里輸入你的公鑰, 要完整的, 不是后30位</pubkey>
    </merpos>

</ccbnetpayconfig>

將ccbnetpaysign.jar包和ccbnetpayconfig.xml配置文件放在相同目錄,在該目錄下執(zhí)行:

java -jar ccbnetpaysign.jar

正常執(zhí)行狀態(tài)下控制臺輸出:server is running on PORT: 55533

代碼:

/**
 * 通過socket向jar包進行數(shù)據(jù)驗簽
 * @param $sendData
 * @return bool
 */
public function validSign($sendData)
{
    // 先在ccbnetpayconfig.xml文件配置相同的端口55533和ccb相關參數(shù)配置, 運行java -jar ccbnetpaysign.jar
    $res = $this->getDataFromServer("127.0.0.1", 55533, $sendData . "\n");
    // todo 驗簽后寫入日志記錄一下
    $firstString = substr($res, 0, 1);
    return $firstString == 'Y' ? true : false;
}

/**
 * 建立socket連接并發(fā)送報文
 * @param $address
 * @param $service_port
 * @param $send_data
 * @return string
 */
private function getDataFromServer($address, $service_port, $send_data)
{
    $socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
    if ($socket < 0) {
        echo "socket創(chuàng)建失敗: " . socket_strerror($socket) . "\n";
    }

    $result = socket_connect($socket, $address, $service_port);
    if ($result < 0) {
        echo "socket連接失敗: ($result) " . socket_strerror($result) . "\n";
    }
    // 發(fā)送命令
    $string = '';
    socket_write($socket, $send_data, strlen($send_data));

    while ($out = socket_read($socket, 2048)) {
        $string .= $out;
    }
    socket_close($socket);

    return $string;
}

然后在你的回調(diào)接口調(diào)用validSign對建行傳過來的數(shù)據(jù)進行驗簽, 驗簽通過才進行其他操作, 比如更新訂單狀態(tài)等等.

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末游盲,一起剝皮案震驚了整個濱河市误墓,隨后出現(xiàn)的幾起案子蛮粮,更是在濱河造成了極大的恐慌,老刑警劉巖谜慌,帶你破解...
    沈念sama閱讀 217,406評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件然想,死亡現(xiàn)場離奇詭異,居然都是意外死亡欣范,警方通過查閱死者的電腦和手機变泄,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,732評論 3 393
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來恼琼,“玉大人妨蛹,你說我怎么就攤上這事〔蛋” “怎么了滑燃?”我有些...
    開封第一講書人閱讀 163,711評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長颓鲜。 經(jīng)常有香客問我表窘,道長,這世上最難降的妖魔是什么甜滨? 我笑而不...
    開封第一講書人閱讀 58,380評論 1 293
  • 正文 為了忘掉前任乐严,我火速辦了婚禮,結果婚禮上衣摩,老公的妹妹穿的比我還像新娘昂验。我一直安慰自己,他們只是感情好艾扮,可當我...
    茶點故事閱讀 67,432評論 6 392
  • 文/花漫 我一把揭開白布既琴。 她就那樣靜靜地躺著,像睡著了一般泡嘴。 火紅的嫁衣襯著肌膚如雪甫恩。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,301評論 1 301
  • 那天酌予,我揣著相機與錄音磺箕,去河邊找鬼。 笑死抛虫,一個胖子當著我的面吹牛松靡,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播建椰,決...
    沈念sama閱讀 40,145評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼雕欺,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起阅茶,我...
    開封第一講書人閱讀 39,008評論 0 276
  • 序言:老撾萬榮一對情侶失蹤蛛枚,失蹤者是張志新(化名)和其女友劉穎谅海,沒想到半個月后脸哀,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,443評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡扭吁,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,649評論 3 334
  • 正文 我和宋清朗相戀三年撞蜂,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片侥袜。...
    茶點故事閱讀 39,795評論 1 347
  • 序言:一個原本活蹦亂跳的男人離奇死亡望薄,死狀恐怖冀痕,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤蹋艺,帶...
    沈念sama閱讀 35,501評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站鸵贬,受9級特大地震影響脚线,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜例隆,卻給世界環(huán)境...
    茶點故事閱讀 41,119評論 3 328
  • 文/蒙蒙 一甥捺、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧镀层,春花似錦镰禾、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,731評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至坞古,卻和暖如春备韧,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背绸贡。 一陣腳步聲響...
    開封第一講書人閱讀 32,865評論 1 269
  • 我被黑心中介騙來泰國打工盯蝴, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人听怕。 一個月前我還...
    沈念sama閱讀 47,899評論 2 370
  • 正文 我出身青樓捧挺,卻偏偏與公主長得像,于是被迫代替她去往敵國和親尿瞭。 傳聞我的和親對象是個殘疾皇子闽烙,可洞房花燭夜當晚...
    茶點故事閱讀 44,724評論 2 354