银联条码支付小微商户进件PHP版DEMO

本示例依赖于银联条码支付【统一】扫码支付PHP版DEMO,此DEMO可在银联官网下载(https://up.95516.com/open/openapi/doc?index_1=1&index_2=1&chapter_1=238&chapter_2=268),新增内容已在代码中标注说明。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
<?php
/**
 * 支付接口调测例子
 * ================================================================
 * index 进入口,方法中转
 * submitOrderInfo 提交订单信息
 * queryOrder 查询订单
 *
 * ================================================================
 */
require('Utils.class.php');
require('config/config.php');
require('class/RequestHandler.class.php');
require('class/ClientResponseHandler.class.php');
require('class/PayHttpClient.class.php');
 
Class Request{
   
 
    private $resHandler = null;
    private $reqHandler = null;
    private $pay = null;
    private $cfg = null;
     
    public function __construct(){
        $this->Request();
    }
 
    public function Request(){
        $this->resHandler = new ClientResponseHandler();
        $this->reqHandler = new RequestHandler();
        $this->pay = new PayHttpClient();
        $this->cfg = new Config();
 
        $this->reqHandler->setGateUrl($this->cfg->C('url'));
 
        $sign_type = $this->cfg->C('sign_type');
         
        if ($sign_type == 'MD5') {
            $this->reqHandler->setKey($this->cfg->C('key'));
            $this->resHandler->setKey($this->cfg->C('key'));
            $this->reqHandler->setSignType($sign_type);
        } else if ($sign_type == 'RSA_1_1' || $sign_type == 'RSA_1_256') {
            $this->reqHandler->setRSAKey($this->cfg->C('private_rsa_key'));
            $this->resHandler->setRSAKey($this->cfg->C('public_rsa_key'));
            $this->reqHandler->setSignType($sign_type);
        }
    }
     
    /* ------------------------------------------------- 新增内容 start ------------------------------------------------- */
     
    /**
     * 图片上传 2020-3-14 By Ken (http://ken.01h.net/) QQ:2480990710
     */
    public function picUpload($path){
        $post_data['partner'] = $this->cfg->C('sign_agentno');//合作伙伴ID即机构号
        $post_data['serviceName'] = 'pic_upload';//服务名称
        $post_data['signType'] = $this->cfg->C('sign_type');//签名类型
        $post_data['data'] = '';//请求数据
        //签名
        $signPars = "";
        ksort($post_data);
        foreach($post_data as $k => $v) {
            if("" != $v &amp;&amp; "dataSign" != $k &amp;&amp; "signType" != $k) {
                $signPars .= $k . "=" . $v . "&amp;";
            }
        }
        $signPars = substr($signPars, 0, -1) . $this->reqHandler->getKey();
        $post_data['dataSign'] = strtolower(md5($signPars));
        //图片
        if(substr(PHP_VERSION, 0, 3)<5.5){  //PHP5.5以下版本
            $post_data['picFile'] = '@'.$path;
        }else//PHP5.5及以上版本
            $post_data['picFile'] = new CURLFile($path);
        }
        $this->pay->setReqContent($this->cfg->C('up_url'), $post_data);
        if($this->pay->call()){
            $res = json_decode(json_encode(simplexml_load_string($this->pay->getResContent(), 'SimpleXMLElement', LIBXML_NOCDATA)), true);  //将XML转为array
            if($res['isSuccess'] == 'T'){  //成功
                return $res['pic'];
            }else{
                return array('status'=>500,'msg'=>'Error Code:'.$res['errorCode'].' Error Message:'.$res['errorMsg']);
            }
        }else{
            return array('status'=>500,'msg'=>'Response Code:'.$this->pay->getResponseCode().' Error Info:'.$this->pay->getErrInfo());
        }
    }
     
    /**
     * 小微商户进件 2020-3-14 By Ken (http://ken.01h.net/) QQ:2480990710
     */
    public function smallMchAdd($merchant){  //merchantName 、 outMerchantId  、 chPayAuth 、 limitCreditPay  、 merchantDetail['merchantShortName'] \ ['industrId'] \ ['province'] \ ['city'] \ ['county'] \ ['address'] \ ['email'] \ ['customerPhone'] \ ['principal'] \ ['principalMobile'] \ ['idCode'] \ ['indentityPhoto'] 、 bankAccount['accountCode'] \ ['bankId'] \ ['accountName'] \ ['accountType'] \ ['contactLine'] \ ['bankName'] \ ['province'] \ ['city'] \ ['idCardType'] \ ['idCard'] \ ['tel'] 、 mchPayConfs[0]['nodename'] \ ['payTypeId'] \ ['billRate'] 、 mchPayConfs[1]['nodename'] \ ['payTypeId'] \ ['billRate'] 、 mchPayConfs[2]['nodename'] \ ['payTypeId'] \ ['billRate'] \ ['billRate1'] ……
        $post_data['partner'] = $this->cfg->C('sign_agentno');//合作伙伴ID即机构号
        $post_data['serviceName'] = 'small_mch_add';//服务名称
        $post_data['signType'] = $this->cfg->C('sign_type');//签名类型
        //数组转XML
        $merchant_xml = simplexml_load_string('<merchant />');
        $this->create_xml($merchant, $merchant_xml);
        $data = $merchant_xml->saveXML();
        $post_data['data'] = str_replace('<?xml version="1.0"?>', '', $data);//请求数据
        //签名
        $signPars = "";
        ksort($post_data);
        foreach($post_data as $k => $v) {
            if("" != $v &amp;&amp; "dataSign" != $k &amp;&amp; "signType" != $k) {
                $signPars .= $k . "=" . $v . "&amp;";
            }
        }
        $signPars = substr($signPars, 0, -1) . $this->reqHandler->getKey();
        $post_data['dataSign'] = strtolower(md5($signPars));
        //组装请求串
        $o = "";
        foreach ($post_data as $k => $v) {
            $o.= "$k=" . urlencode($v) . "&amp;";
        }
        $post_data = substr($o, 0, -1);
        $this->pay->setReqContent($this->cfg->C('up_url'), $post_data);
        if($this->pay->call()){
            $res = json_decode(json_encode(simplexml_load_string($this->pay->getResContent(), 'SimpleXMLElement', LIBXML_NOCDATA)), true);  //将XML转为array
            if($res['isSuccess'] == 'T'){  //成功
                return $res['merchant'];
            }else{
                return array('status'=>500,'msg'=>'Error Code:'.$res['errorCode'].' Error Message:'.$res['errorMsg']);
            }
        }else{
            return array('status'=>500,'msg'=>'Response Code:'.$this->pay->getResponseCode().' Error Info:'.$this->pay->getErrInfo());
        }
    }
    private function create_xml($arr, $xml) {
        foreach($arr as $k=>$v) {
            if(is_array($v)) {  //数组
                if(array_keys($v) !== range(0, count($v)-1)) {  //关联数组
                    $x = $xml->addChild($k);
                    $this->create_xml($v, $x);
                } else //索引数组
                    $x = $xml->addChild($k);
                    foreach ($v as $vv) {
                        $y = $x->addChild($vv['nodename']);
                        unset($vv['nodename']);
                        $this->create_xml($vv, $y);
                    }
                }
            } else {
                $xml->addChild($k, $v);
            }
        }
    }
     
    /* ------------------------------------------------- 新增内容 end ------------------------------------------------- */
     
    /**
     * 提交订单
     */
    public function submitOrderInfo($info){
         
    }
 
?>

调用示例如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
<?php
//调取接口
include './request.php';
$req = new Request();
//上传身份证图片
$indentityPhoto = array();
$card_front = $req->picUpload(dirname(__FILE__).'/upload/card_front.png');
$indentityPhoto[] = $card_front;
$card_back = $req->picUpload(dirname(__FILE__).'/upload/card_back.png');
$indentityPhoto[] = $card_back;
//上传收款银行卡照片
$accountCodePhoto = $req->picUpload(dirname(__FILE__).'/upload/bankPhoto.png');
//上传门头照
$mainPhoto = $req->picUpload(dirname(__FILE__).'/upload/shopPhoto.png');
//商户信息
$info = array();
//商户基本信息
$info['merchantName'] = '商户_张三'//商户名称
$info['outMerchantId'] = 'UP_' . date('YmdHis') . rand(10, 99);  //外商户号
$info['chPayAuth'] = '1'//授权机构交易
$info['limitCreditPay'] = '2'//是否可用信用卡支付, 0:是   1:否   2:不限制
//商户详情信息
$info['merchantDetail']['merchantShortName'] = $info['merchantName'];  //商户简称
$info['merchantDetail']['industrId'] = '5331'//行业类别: 5331 杂货便利店
$info['merchantDetail']['province'] = '3900'//省份: 3900 福建
$info['merchantDetail']['city'] = '3930'//城市: 3930 厦门
$info['merchantDetail']['county'] = '3933'//区县: 3933 湖里
$info['merchantDetail']['address'] = '高新软件园华骏国际大厦七楼702单元'//地址
$info['merchantDetail']['email'] = '2480990710@qq.com'//邮箱
$info['merchantDetail']['customerPhone'] = '13600010002'//客服电话
$info['merchantDetail']['principal'] = '张三'//负责人
$info['merchantDetail']['principalMobile'] = '13600010002'//负责人手机号
$info['merchantDetail']['idCode'] = '350604198705281012'//证件号码
$info['merchantDetail']['indentityPhoto'] = implode(';', $indentityPhoto);  //身份证图片,多张图片以分号;隔开
$info['merchantDetail']['accountCodePhoto'] = $accountCodePhoto//收款银行卡照片
$info['merchantDetail']['mainPhoto'] = $mainPhoto//门头照
//银行账户信息
$info['bankAccount']['accountCode'] = '6222021402018746261'//银行卡号
$info['bankAccount']['bankId'] = '1'//开户银行名编号
$info['bankAccount']['accountName'] = '张三'//开户人
$info['bankAccount']['accountType'] = '1'//帐户类型  1:个人
$info['bankAccount']['contactLine'] = '102100099996'//联行号
$info['bankAccount']['bankName'] = '中国工商银行厦门支行'//开户支行名称
$info['bankAccount']['province'] = '3900'//开户支行所在省
$info['bankAccount']['city'] = '3930'//开户支行所在市
$info['bankAccount']['idCardType'] = '1'//持卡人证件类型  1:身份证
$info['bankAccount']['idCard'] = '350604198705281012'//持卡人证件号码
$info['bankAccount']['tel'] = '13600010002'//银行账户手机号
//商户支付类型信息
$info['mchPayConfs'][] = array('nodename'=>'mchPayConf', 'payTypeId'=>'10014751', 'billRate'=>'3.8');  //支付宝
$info['mchPayConfs'][] = array('nodename'=>'mchPayConf', 'payTypeId'=>'10014761', 'billRate'=>'3.8');
$info['mchPayConfs'][] = array('nodename'=>'mchPayConf', 'payTypeId'=>'10014771', 'billRate'=>'3.8');
$info['mchPayConfs'][] = array('nodename'=>'mchPayConf', 'payTypeId'=>'10002016', 'billRate'=>'6', 'billRate1'=>'6', 'billRate2'=>'6', 'billRate3'=>'6');  //云闪付
$info['mchPayConfs'][] = array('nodename'=>'mchPayConf', 'payTypeId'=>'10000973', 'billRate'=>'6', 'billRate1'=>'6', 'billRate2'=>'6', 'billRate3'=>'6');
$info['mchPayConfs'][] = array('nodename'=>'mchPayConf', 'payTypeId'=>'10000974', 'billRate'=>'6', 'billRate1'=>'6', 'billRate2'=>'6', 'billRate3'=>'6');
$info['mchPayConfs'][] = array('nodename'=>'mchPayConf', 'payTypeId'=>'10000959', 'billRate'=>'3.8');  //微信
$info['mchPayConfs'][] = array('nodename'=>'mchPayConf', 'payTypeId'=>'10000960', 'billRate'=>'3.8');
$info['mchPayConfs'][] = array('nodename'=>'mchPayConf', 'payTypeId'=>'10000961', 'billRate'=>'3.8');
//发送请求
$result = $req->smallMchAdd($info);
if($result['merchantId']){  //进件成功
    //
}else{
    //
}
?>