注:此处只有微信支付清关相关代码,支付自行对接,也适用境外支付清关(需是服务商)。目前微信境外支付需对接第三方机构,第三方机构与微信对接,子商户无法直接对接微信。注:(香港、英国、日本、新加波)四国可以直接对接,需在相关国家注册公司,申请微信支付。
<?php
include_once("./Custom.class.php");
$declareApi = new Declare_pub();
$parameters['out_trade_no'] = isset($_REQUEST['out_trade_no']) ? $_REQUEST['out_trade_no'] : '';//商户订单号
$parameters['customs'] = 'GUANGZHOU_ZS';//海关
$parameters['mch_id'] = 'xxxxxxxx';//支付id
$parameters['transaction_id'] = isset($_REQUEST['transaction_id']) ? $_REQUEST['transaction_id'] : '';//财付通交易号
$pageData['dsss'] = $declareApi->getParameters($parameters);
$url = 'https://api.mch.weixin.qq.com/cgi-bin/mch/customs/customdeclareorder';
$xmlData = "
<xml>
<appid>xxxxxxxxxxxxxx</appid>
<customs>GUANGZHOU_ZS</customs>
<mch_customs_no>xxxxxxxxxxx</mch_customs_no>
<mch_id>xxxxxxxx</mch_id>
<out_trade_no>2018071753495552</out_trade_no>
<sign>".$pageData['dsss']['sign']."</sign>
<transaction_id>42000001572018071717655xxxxx</transaction_id>
</xml>";
$header[] = "Content-type: text/xml"; //定义content-type为xml,注意是数组
$ch = curl_init ($url);
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER,true);
curl_setopt($ch, CURLOPT_HTTPHEADER,$header);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch,CURLOPT_POSTFIELDS, $xmlData);
var_dump($xmlData);
$response = curl_exec($ch);
if(curl_errno($ch)){
var_dump($ch);
}
curl_close($ch);
var_dump($response);
?>
Custom.class.php:
<?php
/**
*接口基类
*/
class Common_util
{
public $result;//返回参数
var $parameters;//请求参数
var $key = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";
var $sign_type = "MD5";
var $mch_customs_no = "xxxx";
/**
* 作用:生成签名
*/
public function createSign($parameters,$key){
//签名步骤一:按字典序排序参数
ksort($parameters);
//签名步骤二:拼接参数
$buff = "";
foreach ($parameters as $k => $v){
$buff .= $k . "=" . $v . "&";
}
//签名步骤三:在string后加入KEY
$str = $buff.'key='.$key;
// echo htmlspecialchars($str).'<br>';
$mysign = "";
if($this->sign_type == 'MD5') {
$mysign = md5($str);
$mysign = strtoupper($mysign);//转成大写
}else {
die("暂不支持".$this->sign_type."类型的签名方式");
}
return $mysign;
}
public function para_filter($parameter) { //除去数组中的空值和签名模式
$para = array();
while (list ($key, $val) = each ($parameter)) {
$filter_arr = array('sign');
if( in_array($key,$filter_arr) || $val=="" ){
continue;
}else{
$para[$key] = $parameter[$key];
}
}
return $para;
}
}
/**
* 海关申报接口
*/
class Declare_pub extends Common_util
{
function __construct()
{
//设置接口链接
$this->url = 'https://api.mch.weixin.qq.com/cgi-bin/mch/customs/customdeclareorder';
}
/**
* 生成参数
*/
function getParameters($parameters) //merchantId,orderId
{
$this->parameters = $parameters;
if($this->parameters["customs"] == null)//海关
{
exit("缺少必填参数customs!"."<br>");
}
if($this->parameters["out_trade_no"] == null && $this->parameters["transaction_id"] == null)//海关
{
exit("缺少必填参数out_trade_no或者transaction_id!"."<br>");
}
//增加其他必须参数
//$this->parameters["sign_type"] = $this->sign_type;//加密类型
//$this->parameters["service_version"] = $this->service_version;
//$this->parameters["input_charset"] = $this->input_charset;
//$this->parameters["sign_key_index"] = $this->sign_key_index;
//$this->parameters["partner"] = $this->partner;
$this->parameters["appid"] = 'xxxxxxxxxx';
$this->parameters["mch_customs_no"] = $this->mch_customs_no;//商户海关备案号
//增加其他必须参数 签名
$this->parameters["sign"] = $this->createSign( $this->para_filter($this->parameters),$this->key);//签名
return $this->parameters;
}
}
?>