微信的支付邏輯與支付寶的支付有一些差別。為了讓客戶端忽略這些差別,統一呼叫。本sdk做了對應處理。
# SDK呼叫
微信支付不同介面需要的引數會有差別。請大家在使用介面時,仔細檢視文件。
use Payment\ChargeContext;
use Payment\Config;
use Payment\Common\PayException;
// 微信支付,必須設定時區,否則發生錯誤
date_default_timezone_set('Asia/Shanghai');
// 生成訂單號 便於測試
function createPayid()
{
return date('Ymdhis', time()).substr(floor(microtime()*1000),0,1).rand(0,9);
}
// 訂單資訊
$payData = [
"order_no" => createPayid(),
"amount" => '0.01',// 單位為元 ,最小為0.01
"client_ip" => '127.0.0.1',
"subject" => '測試支付',
"body" => '支付介面測試',
"extra_param" => '',
];
// 微信掃碼支付,需要設定的引數
$payData['product_id'] = '123456';
// 微信公眾號支付,需要的引數
$payData['openid'] = 'otijfvr2oMz3tXnaQdKKbQeeBmhM';// 需要通過微信提供的api獲取該openid
/**
* 包含客戶的配置檔案
* 本次 2.0 版本,主要的改變是將配置檔案獨立出來,便於客戶多個賬號的情況
* 已經使用不同方式讀取配置檔案,如:db file cache等
*/
$wxconfig = [
'app_id' => 'wxxxx', // 公眾賬號ID
'mch_id' => 'xxxx',// 商戶id
'md5_key' => 'xxxxxx',// md5 祕鑰
'notify_url' => 'http://test.helei.com/pay-notify.html',
'time_expire' => '14',
// 涉及資金流動時,需要提供該檔案
'cert_path' => dirname(__FILE__) . DIRECTORY_SEPARATOR . 'wx' . DIRECTORY_SEPARATOR . 'apiclient_cert.pem',
'key_path' => dirname(__FILE__) . DIRECTORY_SEPARATOR . 'wx' . DIRECTORY_SEPARATOR . 'apiclient_key.pem',
];
/**
* 例項化支付環境類,進行支付建立
*/
$charge = new ChargeContext();
try {
// 微信 掃碼支付
$type = Config::WX_CHANNEL_QR;
// 微信 APP支付
//$type = Config::WX_CHANNEL_APP;
// 微信 公眾號支付
//$type = Config::WX_CHANNEL_PUB;
$charge->initCharge($type, $wxconfig);
$ret = $charge->charge($payData);
} catch (PayException $e) {
echo $e->errorMessage();exit;
}
if ($type === Config::WX_CHANNEL_QR) {
$url = urlencode($ret);
echo "<img alt='掃碼支付' src='http://paysdk.weixin.qq.com/example/qrcode.php?data={$url}' style='width:150px;height:150px;'/>";
} elseif ($type === Config::WX_CHANNEL_PUB) {
$json = $ret;
var_dump($json);exit;
} elseif (stripos($type, 'wx') !== false) {
var_dump($ret);
}
?>
這裡掃碼支付與公眾號支付分別需要提供不同的引數。請一定注意進行區分。否則呼叫相應埠會丟擲異常。
配置檔案
引數 | 引數名 | 引數說明 | 是否必須 |
---|---|---|---|
app_id | 公眾賬號ID/應用id | 微信分配的公眾賬號ID | 是 |
mch_id | 商戶號 | 微信支付分配的商戶號 | 是 |
md5_key | 加密的key | 在商戶中心設定 | 是 |
notify_url | 通知地址 | 接收微信支付非同步通知回撥地址,通知url必須為直接可訪問的url,不能攜帶引數。 | 是 |
time_expire | 交易過期時間 | 單位為分鐘,過期後無法再次支付 | 是 |
cert_path | 金鑰檔案 | 可在微信商戶後臺中下載 | 否,退款需要 |
key_path | 金鑰檔案 | 可在商戶中心下載 | 否,退款需要 |
這裡需要注意的是,app_id,由於微信的三個支付介面,需要對應兩個不同的app_id。因此再開發中一定要注意。
請求引數
引數 | 引數名 | 引數說明 | 是否必須 |
---|---|---|---|
order_no | 訂單號 | 平臺根據規則生成的訂單號,最長64位,要在商戶資料庫中唯一 | 必須 |
amount | 交易總金額 | 該筆訂單的資金總額,單位為RMB-Yuan。取值範圍為[0.01,100000000.00],精確到小數點後兩位。 | 必須 |
client_ip | 客戶端IP | 使用者在建立交易時,該使用者當前所使用機器的IP。 | 必須 |
subject | 商品名稱 | 商品的標題/交易標題/訂單標題/訂單關鍵字等。該引數最長為128個漢字。 | 必須 |
body | 商品描述 | 對一筆交易的具體描述資訊。如果是多種商品,請將商品描述字串累加傳給body。 | 必須 |
extra_param | 公用回傳引數 | 如果使用者請求時傳遞了該引數,則返回給商戶時會回傳該引數。 | 可選 |
product_id | 商品ID | 掃碼支付,此引數必傳。此id為二維碼中包含的商品ID,商戶自行定義。 | 可選 |
openid | 使用者標識 | 公眾號支付,此引數必傳,使用者在商戶appid下的唯一標識。 | 可選 |
返回值描述
三種支付方式返回值因為處理方式不同,微信方面返回了不同的型別。
app支付返回了需要呼叫的陣列。呼叫客戶端的方式 檢視微信文件
掃碼支付返回了一個地址。可生成一個二維碼,完成支付。
公眾號支付,返回的是一個json資料。可直接放入微信的sdk完成jsapi呼叫。