微信的三種支付方式接入:APP支付、公衆號支付、掃碼支付

payment 項目2.0版本 php

微信的支付邏輯與支付寶的支付有一些差異。爲了讓客戶端忽略這些差異,統一調用。本sdk作了對應處理。html

# SDK調用git

微信支付不一樣接口須要的參數會有差異。請你們在使用接口時,仔細查看文檔。github

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。所以再開發中必定要注意。json

請求參數

參數 參數名 參數說明 是否必須
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下的惟一標識。 可選

返回值描述

三種支付方式返回值由於處理方式不一樣,微信方面返回了不一樣的類型。api

  • app支付返回了須要調用的數組。調用客戶端的方式 查看微信文檔數組

  • 掃碼支付返回了一個地址。可生成一個二維碼,完成支付。微信

  • 公衆號支付,返回的是一個json數據。可直接放入微信的sdk完成jsapi調用。app

相關文章
相關標籤/搜索