wechat-php-sdk

 

wechat-php-sdk

微信公衆平臺php版開發包javascript

  • 支持消息加解密方式的明文模式、兼容模式、安全模式
  • 支持自動接入微信公衆平臺(步驟

功能模塊

Wechat (處理自動接入、獲取與回覆微信消息)(使用說明)php

Api (處理須要access_token的主動接口)(使用說明)html

 

DEMO

項目內 demo/demo_simple.phpjava

require 'wechat-php-sdk/autoload.php';

use Gaoming13\WechatPhpSdk\Wechat;

$wechat = new Wechat(array(     
    'appId'         =>  'wx733d7f24bd29224a',   
    'token'         =>  'gaoming13',        
    'encodingAESKey' => '072vHYArTp33eFwznlSvTRvuyOTe5YME1vxSoyZbzaV'
));

// 獲取消息
$msg = $wechat->serve();

// 回覆消息
if ($msg->MsgType == 'text' && $msg->Content == '你好') {
    $wechat->reply("你也好!");
} else {
    $wechat->reply("聽不懂!");
}

如何引入wechat-php-sdk

  1. 手動引入
  <?php   
      require "wechat-php-sdk/autoload.php"; // 引入自動加載SDK類的方法 use Gaoming13\WechatPhpSdk\Wechat; use Gaoming13\WechatPhpSdk\Api; ... 
  1. 使用 composer
  #安裝composer依賴
  composer require "gaoming13/wechat-php-sdk:1.5.*" composer dump-autoload --optimize 
  require "vendor/autoload.php";
  use Gaoming13\WechatPhpSdk\Wechat;
  use Gaoming13\WechatPhpSdk\Api;
  1. ThinkPHP 內使用

將SDK內 src 文件夾重命名爲 Gaoming13, 拷貝至 ThinkPHP/Library/ 下便可使用 Wechat 和 Api 類庫.git

Thinkphp控制器內使用SDK的DEMO:web

具體代碼見: 項目內 demo/demo_thinkPHP.phpredis

  $wechat = new \Gaoming13\WechatPhpSdk\Wechat(array(       
    'appId' => $appId,  
    'token' =>  $token,
    'encodingAESKey' => $encodingAESKey
  ));

  $api = new \Gaoming13\WechatPhpSdk\Api(
    array(
        'appId' => $appId,
        'appSecret' => $appSecret,
        'get_access_token' => function(){
            // 用戶須要本身實現access_token的返回
            ...
        },
        'save_access_token' => function($token) {
            // 用戶須要本身實現access_token的保存
            ...
        }
    )
  );

接入微信公衆平臺開發方法

官方wiki數據庫

以項目中的 demo/demo_simple.php 爲例json

  1. 進入本身微信公衆平臺 開發者中心, 進入修改服務器配置頁面
  2. URL填寫demo_simple.php的訪問地址, 好比http://wx.diary8.com/demo/demo_simple.php,確保外網可訪問到
  3. 填寫TokenEncodingAESKey消息加解密方式可任意選擇
  4. 修改demo.php裏配置項appIdtokenappIdAppID(應用ID),token爲第3部填寫的token, 若是消息加解密方式選擇了兼容模式安全模式,還須要填寫encodingAESKey
  5. 提交服務器配置表單
  6. !!! 注意成功後還須要啓用服務器配置,否則不生效

Wechat: 模塊使用說明

$wechat = new Wechat(array( 
    // 開發者中心-配置項-AppID(應用ID)        
    'appId'         =>  'wx733d7f24bd29224a',
    // 開發者中心-配置項-服務器配置-Token(令牌)
    'token'         =>  'gaoming13',
    // 開發者中心-配置項-服務器配置-EncodingAESKey(消息加解密密鑰)
    // 可選: 消息加解密方式勾選 兼容模式 或 安全模式 需填寫
    'encodingAESKey' => '072vHYArTp33eFwznlSvTRvuyOTe5YME1vxSoyZbzaV'
));

// 獲取微信消息
$msg = $wechat->serve();

// 回覆微信消息
if ($msg->MsgType == 'text' && $msg->Content == '你好') {
    $wechat->reply("你也好!");
} else {
    $wechat->reply("聽不懂!");
}

Wechat: 接收普通消息/事件推送

接受到的普通消息與事件推送會原樣以數組對象返回,具體每種消息結構請看:api

官方wiki 接收普通消息
官方wiki 接收事件推送

$msg = $wechat->serve();

Wechat: 被動回覆(文本、圖片、語音、視頻、音樂、圖文)

官方wiki

回覆文本消息

$wechat->reply('hello world!');
// 或者
$wechat->reply(array(
    'type' => 'text',
    'content' => '嘿嘿,呵呵~~'
));

回覆圖片消息

$wechat->reply(array(
    'type' => 'image',
    // 經過素材管理接口上傳多媒體文件,獲得的id
    'media_id' => 'Uq7OczuEGEyUu--dYjg7seTm-EJTa0Zj7UDP9zUGNkVpjcEHhl7tU2Mv8mFRiLKC'
));

回覆語音消息

$wechat->reply(array(
    'type' => 'voice',
    // 經過素材管理接口上傳多媒體文件,獲得的id
    'media_id' => 'rVT43tfDwjh4p1BV2gJ5D7Zl2BswChO5L_llmlphLaTPytcGcguBAEJ1qK4cg4r_'
));

回覆視頻消息

$wechat->reply(array(
    'type' => 'video',
    // 經過素材管理接口上傳多媒體文件,獲得的id
    'media_id' => 'yV0l71NL0wtpRA8OMX0-dBRQsMVyt3fspPUzurIS3psi6eWOrb_WlEeO39jasoZ8',
    'title' => '視頻消息的標題',         //可選
    'description' => '視頻消息的描述'        //可選
));

回覆音樂消息

$wechat->reply(array(
    'type' => 'music',
    'title' => '音樂標題',                      //可選
    'description' => '音樂描述',                //可選
    'music_url' => 'http://me.diary8.com/data/music/2.mp3',     //可選
    'hqmusic_url' => 'http://me.diary8.com/data/music/2.mp3',   //可選
    'thumb_media_id' => 'O39wW0ZsXCb5VhFoCgibQs5PupFb6VZ2jH5A8gHUJCJz2Qmkrb7objoTue7bGTGQ',
));

回覆圖文消息

$wechat->reply(array(
    'type' => 'news',
        'articles' => array(
         array(
            'title' => '圖文消息標題1',                               //可選
            'description' => '圖文消息描述1',                     //可選
            'picurl' => 'http://me.diary8.com/data/img/demo1.jpg',  //可選
            'url' => 'http://www.example.com/'                      //可選
         ),
        array(
            'title' => '圖文消息標題2',
            'description' => '圖文消息描述2',
            'picurl' => 'http://me.diary8.com/data/img/demo2.jpg',
            'url' => 'http://www.example.com/'
        ),
        array(
            'title' => '圖文消息標題3',
            'description' => '圖文消息描述3',
            'picurl' => 'http://me.diary8.com/data/img/demo3.jpg',
            'url' => 'http://www.example.com/'
        )
    )
));

Wechat: 轉發到多客服接口

$wechat->reply(array(
    'type' => 'transfer_customer_service',
    'kf_account' => 'test1@test'                // 可選
));

Api: 模塊使用說明

access_token須要用戶本身實現緩存

因爲微信的access_token請求次數有限制,

用戶須要本身實現access_token的獲取和保存,

不然access_token每次都會被更新,請求限額很快就用完了.

$api = new Api(
    array(
        'appId' => $appId,
        'appSecret' => $appSecret,
        'get_access_token' => function() {
            // 用戶須要在這裏實現access_token的返回
            ...
        },
        'save_access_token' => function($token) {
            // 用戶須要在這裏實現access_token的保存
            ...
        }
    )
);

access_token能夠保存在數據庫、Memcached、xcache 等.

當同一個微信號被用於多個項目中,access_token須要全局維護.

如下DEMO使用了Memcached緩存access_token

具體代碼見: demo/demo_message.php

use Gaoming13\WechatPhpSdk\Wechat;
use Gaoming13\WechatPhpSdk\Api;

// AppID(應用ID)
$appId = 'wx733d7f24bd29224a';
// AppSecret(應用密鑰)
$appSecret = 'c6de6zcw78522dddww8w42e403376a410e';
// Token(令牌)
$token = 'gaoming13';
// EncodingAESKey(消息加解密密鑰)
$encodingAESKey = '072vHYArTp33eFwznlSvTRvuyOTe5YME1vxSoyZbzaV';

// 這是使用了Memcached來保存access_token
$m = new Memcached();
$m->addServer('localhost', 11211);

// wechat模塊 - 處理用戶發送的消息和回覆消息
$wechat = new Wechat(array(     
    'appId' => $appId,  
    'token' =>  $token,
    'encodingAESKey' => $encodingAESKey
));

// api模塊 - 包含各類系統主動發起的功能
$api = new Api(
    array(
        'appId' => $appId,
        'appSecret' => $appSecret,
        'get_access_token' => function() use ($m) {
            // 用戶須要本身實現access_token的返回
            return $m->get('access_token');
        },
        'save_access_token' => function($token) use ($m) {
            // 用戶須要本身實現access_token的保存
            $m->set('access_token', $token, 0);
        },
        'get_jsapi_ticket' => function() use ($m) {
            // 可選:用戶須要本身實現jsapi_ticket的返回(若使用get_jsapi_config,則必須定義)
            return $m->get('jsapi_ticket');
        },
        'save_jsapi_ticket' => function($jsapi_ticket) use ($m) {
            // 可選:用戶須要本身實現jsapi_ticket的保存(若使用get_jsapi_config,則必須定義)
            $m->set('jsapi_ticket', $jsapi_ticket, 0);
        }
    )
);


// 獲取微信消息
$msg = $wechat->serve();

// 被動回覆用戶消息
$wechat->reply('這是我被動發送的消息!');

// 主動發送文本消息
$api->send($msg->FromUserName, '這是我主動發送的消息!');

Api模塊接口返回值格式

全部Api模塊的接口返回值格式爲: array($err, $data);

$err爲錯誤信息, $data爲正確處理返回的數據

可用list接收:

list($err, $kf_list) = $api->get_kf_list();
if (is_null($err)) {
    // 接口正確返回處理
} else {
    // 接口錯誤返回處理
}

Api:發送客服消息(文本、圖片、語音、視頻、音樂、圖文)

官方wiki

主動發送文本消息

$api->send($msg->FromUserName, 'heheh');
// 或者
$api->send($msg->FromUserName, array(
    'type' => 'text',
    'content' => 'hello world!',
    'kf_account' => 'test1@kftest'      // 可選(指定某個客服發送, 會顯示這個客服的頭像)
));

主動發送圖片消息

$api->send($msg->FromUserName, array(
    'type' => 'image',
    'media_id' => 'Uq7OczuEGEyUu--dYjg7seTm-EJTa0Zj7UDP9zUGNkVpjcEHhl7tU2Mv8mFRiLKC',
    'kf_account' => 'test1@kftest'      // 可選(指定某個客服發送, 會顯示這個客服的頭像)
));

主動發送語音消息

$api->send($msg->FromUserName, array(
    'type' => 'voice',
    'media_id' => 'rVT43tfDwjh4p1BV2gJ5D7Zl2BswChO5L_llmlphLaTPytcGcguBAEJ1qK4cg4r_',
    'kf_account' => 'test1@kftest'      // 可選(指定某個客服發送, 會顯示這個客服的頭像)
));

主動發送視頻消息

$api->send($msg->FromUserName, array(
    'type' => 'video',
    'media_id' => 'yV0l71NL0wtpRA8OMX0-dBRQsMVyt3fspPUzurIS3psi6eWOrb_WlEeO39jasoZ8',
    'thumb_media_id' => '7ct_DvuwZXIO9e9qbIf2ThkonUX_FzLAoqBrK-jzUboTYJX0ngOhbz6loS-wDvyZ',     // 可選(無效, 官方文檔好像寫錯了)
    'title' => '視頻消息的標題',         // 可選
    'description' => '視頻消息的描述',       // 可選,
    'kf_account' => 'test1@kftest'          // 可選(指定某個客服發送, 會顯示這個客服的頭像)
));

主動發送音樂消息

$api->send($msg->FromUserName, array(
    'type' => 'music',
    'title' => '音樂標題',                      //可選
    'description' => '音樂描述',                //可選
    'music_url' => 'http://me.diary8.com/data/music/2.mp3',     //可選
    'hqmusic_url' => 'http://me.diary8.com/data/music/2.mp3',   //可選
    'thumb_media_id' => 'O39wW0ZsXCb5VhFoCgibQs5PupFb6VZ2jH5A8gHUJCJz2Qmkrb7objoTue7bGTGQ',
    'kf_account' => 'test1@kftest'      // 可選(指定某個客服發送, 會顯示這個客服的頭像)
));

主動發送圖文消息

$api->send($msg->FromUserName, array(
    'type' => 'news',
    'articles' => array(
        array(
            'title' => '圖文消息標題1',                               //可選
            'description' => '圖文消息描述1',                     //可選
            'picurl' => 'http://me.diary8.com/data/img/demo1.jpg',  //可選
            'url' => 'http://www.example.com/'                      //可選
        ),
        array(
            'title' => '圖文消息標題2',
            'description' => '圖文消息描述2',
            'picurl' => 'http://me.diary8.com/data/img/demo2.jpg',
            'url' => 'http://www.example.com/'
        ),
        array(
            'title' => '圖文消息標題3',
            'description' => '圖文消息描述3',
            'picurl' => 'http://me.diary8.com/data/img/demo3.jpg',
            'url' => 'http://www.example.com/'
        )
    ),
    'kf_account' => 'test1@kftest'      // 可選(指定某個客服發送, 會顯示這個客服的頭像)
));

Api:多客服功能(客服管理、多客服回話控制、獲取客服聊天記錄等)

官方wiki

添加客服帳號

$api->add_kf('test1234@微信號', '客服暱稱', '客服密碼');

設置客服信息

$api->update_kf('test1234@微信號', '客服暱稱', '客服密碼');

上傳客服頭像

$api->set_kf_avatar('GB2@gbchina2000', '/website/wx/demo/test.jpg');

刪除客服賬號

$api->del_kf('test1234@微信號');

獲取全部客服帳號

$api->get_kf_list();

獲取在線客服接待信息

$api->get_online_kf_list();

獲取客服聊天記錄接口

$api->get_kf_records(1439348167, 1439384060, 1, 10);

建立客戶與客服的會話

$api->create_kf_session('ocNtAt_K8nRlAdmNEo_R0WVg_rRw', 'test1@微信號', '小明請求接入會話!');

關閉客戶與客服的會話

$api->close_kf_session('ocNtAt_K8nRlAdmNEo_R0WVg_rRw', 'test1@微信號', '與小明的回話已關閉!');

獲取客戶的會話狀態

$api->get_kf_session('ocNtAt_K8nRlAdmNEo_R0WVg_rRw');

獲取客服的會話列表

$api->get_kf_session_list('test1@微信號');

獲取未接入會話列表的客戶

$api->get_waitcase_list();

Api:素材管理(臨時素材、永久素材、素材統計)

官方wiki

新增臨時素材

$api->upload_media('image', '/data/img/fighting.jpg');
$api->upload_media('voice', '/data/img/song.amr');
$api->upload_media('video', '/data/img/go.mp4');
$api->upload_media('thumb', '/data/img/sky.jpg');

獲取臨時素材URL

$api->get_media('UNsNhYrHG6e0oUtC8AyjCntIW1JYoBOmmwvM4oCcxZUBQ5PDFgeB9umDhrd9zOa-');

下載臨時素材

header('Content-type: image/jpg');
list($err, $data) = $api->download_media('UNsNhYrHG6e0oUtC8AyjCntIW1JYoBOmmwvM4oCcxZUBQ5PDFgeB9umDhrd9zOa-');
echo $data;

新增永久素材

// 新增圖片素材
list($err, $res) = $api->add_material('image', '/website/me/data/img/fighting.jpg');
// 新增音頻素材
list($err, $res) = $api->add_material('voice', '/data/img/song.amr');
// 新增視頻素材
list($err, $res) = $api->add_material('video', '/website/me/data/video/2.mp4', '視頻素材的標題', '視頻素材的描述');
// 新增略縮圖素材
list($err, $res) = $api->add_material('thumb', '/data/img/sky.jpg');

新增永久圖文素材

$api->add_news(array(
    array(
        'title' => '標題',
        'thumb_media_id' => '圖文消息的封面圖片素材id(必須是永久mediaID)',
        'author' => '做者',
        'digest' => '圖文消息的摘要,僅有單圖文消息纔有摘要,多圖文此處爲空',
        'show_cover_pic' => '是否顯示封面,0爲false,即不顯示,1爲true,即顯示',
        'content' => '圖文消息的具體內容,支持HTML標籤,必須少於2萬字符,小於1M,且此處會去除JS',
        'content_source_url' => '圖文消息的原文地址,即點擊「閱讀原文」後的URL'
    ),
    array(
        'title' => '這是圖文的標題',
        'thumb_media_id' => 'BZ-ih-dnjWDyNXjai6i6sdvxOoXOHr9wO0pgMhcZR8g',
        'author' => '這是圖文的做者',
        'digest' => '',
        'show_cover_pic' => true,
        'content' => '這是圖文消息的具體內容',
        'content_source_url' => 'http://www.baidu.com/'
    )
));

修改永久圖文素材

list($err, $res) = $api->update_news('BZ-ih-dnjWDyNXjai6i6sZp22xhHu6twVYKNPyl77Ms', array(
    'title' => '標題',
    'thumb_media_id' => 'BZ-ih-dnjWDyNXjai6i6sdvxOoXOHr9wO0pgMhcZR8g',
    'author' => '做者',
    'digest' => '圖文消息的摘要',
    'show_cover_pic' => true,
    'content' => '圖文消息的具體內容',
    'content_source_url' => 'http://www.diandian.com/'
), 1); 

獲取永久素材

// 獲取圖片、音頻、略縮圖素材
// 返回素材的內容,可保存爲文件或直接輸出
header('Content-type: image/jpg');
list($err, $data) = $api->get_material('BZ-ih-dnjWDyNXjai6i6sdvxOoXOHr9wO0pgMhcZR8g');
echo $data;

// 獲取視頻素材
// 返回帶down_url的json字符串
list($err, $data) = $api->get_material('BZ-ih-dnjWDyNXjai6i6sbOICualzdwwnWWBqxW39Xk');
var_dump(json_decode($data));

// 獲取圖文素材
// 返回圖文的json字符串     
list($err, $data) = $api->get_material('BZ-ih-dnjWDyNXjai6i6sdvxOoXOHr9wO0pgMhcZR8g');
var_dump(json_decode($data));

刪除永久素材

list($err, $res) = $api->del_material('BZ-ih-dnjWDyNXjai6i6sbOICualzdwwnWWBqxW39Xk');
if (is_null($err)) {
    // 刪除成功
}

獲取素材總數

$api->get_material_count();

獲取素材列表

$api->get_materials('image', 0, 20);
$api->get_materials('voice', 0, 20);
$api->get_materials('video', 0, 20);
$api->get_materials('thumb', 0, 20);

Api:自定義菜單管理(建立、查詢、刪除菜單)

官方wiki

自定義菜單建立接口

$api->create_menu('
{
    "button":[
        {   
          "type":"click",
          "name":"主菜單1",
          "key":"V1001_TODAY_MUSIC"
        },
        {
            "name":"主菜單2",
            "sub_button":[
                {
                    "type":"click",
                    "name":"點擊推事件",
                    "key":"click_event1"
                },
                {
                    "type":"view",
                    "name":"跳轉URL",
                    "url":"http://www.example.com/"
                },
                {
                    "type":"scancode_push",
                    "name":"掃碼推事件",
                    "key":"scancode_push_event1"
                },
                {
                    "type":"scancode_waitmsg",
                    "name":"掃碼帶提示",
                    "key":"scancode_waitmsg_event1"
                }
            ]
       },
       {
            "name":"主菜單3",
            "sub_button":[
                {
                    "type":"pic_sysphoto",
                    "name":"系統拍照發圖",
                    "key":"pic_sysphoto_event1"
                },
                {
                    "type":"pic_photo_or_album",
                    "name":"拍照或者相冊發圖",
                    "key":"pic_photo_or_album_event1"
                },
                {
                    "type":"pic_weixin",
                    "name":"微信相冊發圖",
                    "key":"pic_weixin_event1"
                },
                {
                    "type":"location_select",
                    "name":"發送位置",
                    "key":"location_select_event1"
                }
            ]
       }
    ]
}');

自定義菜單查詢接口

$api->get_menu();

自定義菜單刪除接口

$api->delete_menu();

獲取自定義菜單配置接口

$api->get_selfmenu();

Api:微信JSSDK(生成微信JSSDK所需的配置信息)

官方wiki

獲取JS-SDK配置須要的信息

使用前請確認,初始化Api時,已填寫並實現了get_jsapi_ticketsave_jsapi_ticket

$api->get_jsapi_config();
$api->get_jsapi_config('http://www.baidu.com/');

$api->get_jsapi_config('', 'json');
$api->get_jsapi_config('', 'jsonp');
$api->get_jsapi_config('', 'jsonp', 'callback');

Api:帳號管理(生成帶參數的二維碼、長連接轉短連接接口)

官方wiki

生成帶參數的二維碼

list($err, $data) = $api->create_qrcode(1234); // 建立一個永久二維碼
list($err, $data) = $api->create_qrcode(1234, 100); //建立一個臨時二維碼,有效期100秒

經過ticket換取二維碼,返回二維碼url地址

$api->get_qrcode_url('gQH58DoAAAAAAAAAASxodHRwOi8vd2VpeGluLnFxLmNvbS9xLzQweUctT2psME1lcEJPYWJkbUswAAIEApzVVQMEZAAAAA==');

經過ticket換取二維碼,返回二維碼圖片的內容

list($err, $data) = $api->get_qrcode('gQGa8ToAAAAAAAAAASxodHRwOi8vd2VpeGluLnFxLmNvbS9xLzlVeXJZWS1seGNlODZ2SV9XMkMwAAIEo5rVVQMEAAAAAA==');
header('Content-type: image/jpg');
echo $data;

長連接轉短連接接口

list($err, $data) = $api->shorturl('http://me.diary8.com/category/web-front-end.html');
echo $data->short_url;

Api:用戶管理(用戶分組管理、設置用戶備註名、獲取用戶基本信息、獲取用戶列表、網頁受權獲取用戶基本信息)

官方wiki

用戶分組管理 - 建立分組

list($err, $data) = $api->create_group('新的一個分組');
echo $data->group->id;

用戶分組管理 - 查詢全部分組

list($err, $data) = $api->get_groups();
foreach ($data->groups as $group) {
    var_dump($group);
}

用戶分組管理 - 查詢用戶所在分組

list($err, $data) = $api->get_user_group('ocNtAt0YPGDme5tJBXyTphvrQIrc');
echo $data->groupid;

用戶分組管理 - 修改分組名

$api->update_group(100, '自定義分組了');

用戶分組管理 - 移動用戶分組

$api->update_user_group('ocNtAt0YPGDme5tJBXyTphvrQIrc', 100);

用戶分組管理 - 批量移動用戶分組

$api->batchupdate_user_group(array(
    'ocNtAt0YPGDme5tJBXyTphvrQIrc',
    'ocNtAt_TirhYM6waGeNUbCfhtZoA',
    'ocNtAt_K8nRlAdmNEo_R0WVg_rRw'
    ), 100);

用戶分組管理 - 刪除分組

$api->delete_group(102);

設置用戶備註名

$api->update_user_remark('ocNtAt0YPGDme5tJBXyTphvrQIrc', '用戶的備註名');

獲取用戶基本信息

$api->get_user_info('ocNtAt_K8nRlAdmNEo_R0WVg_rRw');
$api->get_user_info('ocNtAt_K8nRlAdmNEo_R0WVg_rRw', 'zh_TW');

獲取用戶列表

$api->get_user_list();
$api->get_user_list('ocNtAt_TirhYM6waGeNUbCfhtZoA');

網頁受權獲取用戶基本信息

有兩種受權類型:

  1. snsapi_base 靜默受權,用戶無感知,但只能獲取到openid
  2. snsapi_userinfo 能夠得到openid、暱稱、性別、所在地等更詳細的信息,但首次受權會跳轉微信的一個受權頁面,用戶點擊贊成後受權成功

兩種受權流程使用說明:

demo見項目內 demo/snsapi/

  1. 經過 get_authorize_url 生成獲取用戶受權的連接,用戶打開該連接後會跳轉到 回調地址頁面

    $api->get_authorize_url('受權類型', '回調地址');
    $api->get_authorize_url('snsapi_base','http://wx.diary8.com/demo/snsapi/callback_snsapi_base.php');
    $api->get_authorize_url('snsapi_userinfo', 'http://wx.diary8.com/demo/snsapi/callback_snsapi_userinfo.php');
    
  2. 在 回調地址頁面 經過 get_userinfo_by_authorize 獲取用戶信息

    list($err, $user_info) = $api->get_userinfo_by_authorize('snsapi_base');
    if ($user_info !== null) {
        var_dump($user_info);;
    } else {
        echo '受權失敗!';
    }
    
    list($err, $user_info) = $api->get_userinfo_by_authorize('snsapi_userinfo');
    if ($user_info !== null) {
        var_dump($user_info);;
    } else {
        echo '受權失敗!';
    }
    

Api:微信JSAPI支付

官方wiki

官方SDK

支付過程當中SDK使用流程:

  • 經過 網頁受權獲取用戶基本信息 openid
  • 調用 wxPayUnifiedOrder 生成預訂單
  • 調用 getWxPayJsApiParameters 生成jsapi支付的參數,做爲js調用支付接口的參數

eg: api

/* @var $cache \yii\redis\cache */
$cache = \Yii::$app->cache;

$api = new Api([
    'appId' => 'wx312273d5za28s525', //AppID
    'appSecret' => '7d8e268465d6ec7ch2f4ed2364h5ef32', //AppSecret
    'mchId' => '1633246021', //微信支付商戶號
    'key' => '613A60282Aa87E2B1A22E3A3DFD9AE32A', //微信商戶API密鑰
    'get_access_token' => function() use ($cache) {
        return $cache->get('WE_CHAT_SDK_ACCESS_TOKEN');
    },
    'save_access_token' => function($token) use ($cache) {
        $cache->set('WE_CHAT_SDK_ACCESS_TOKEN', $token);
    }
]);;

eg: 頁面內調起微信支付

// 獲取用戶的openid
list($err, $user_info) = $api->get_userinfo_by_authorize('snsapi_base');
if ($user_info == null) {
    $url = $api->get_authorize_url('snsapi_base', Yii::$app->request->absoluteUrl);
    return $this->controller->redirect($url);
}

// 生成預訂單
$wxOrder = $api->wxPayUnifiedOrder($user_info->openid, [
    'out_trade_no' => JiariOrder::getOutTradeNo($order['id']),
    'body' => '[NO.'.$order['batch_id'].']'.$order['name'],
    'total_fee' => (double)$order['total_pay_need'] * 100,
    //'time_expire' => date('YmdHis', (int)$order['created_at'] + (int)$order['timeout']),
    'notify_url' => HTTP.'://my.'.IDN.'/we-chat-pay/asyn-notify',
]);
// 判斷預訂單是否生成成功
if ($wxOrder['return_code'] != 'SUCCESS') {
    Yii::error(['微信支付預訂單生成失敗', $wxOrder, $order], __METHOD__);

    throw new NotFoundHttpException('使用微信支付失敗,請改用其它支付方式!');
}

// 生成微信支付JSAPI參數
if (! array_key_exists('prepay_id', $wxOrder)) {
    Yii::error(['微信支付預訂單生成失敗', $wxOrder, $order], __METHOD__);
    throw new NotFoundHttpException('使用微信支付失敗,請改用其它支付方式!');
}
$jsApiParams = $api->getWxPayJsApiParameters($wxOrder['prepay_id']);
<html>
<head> <meta http-equiv="content-type" content="text/html;charset=utf-8"/> <meta name="viewport" content="width=device-width, initial-scale=1"/> <title>微信支付</title> <script type="text/javascript"> function jsApiCall() { WeixinJSBridge.invoke( 'getBrandWCPayRequest', <?= $jsApiParams ?>, function(res){ alert(JSON.stringfy(res)); WeixinJSBridge.log(res.err_msg); alert(res.err_code+res.err_desc+res.err_msg); } ); } if (typeof WeixinJSBridge == 'undefined'){ if( document.addEventListener ){ document.addEventListener('WeixinJSBridgeReady', jsApiCall, false); }else if (document.attachEvent){ document.attachEvent('WeixinJSBridgeReady', jsApiCall); document.attachEvent('onWeixinJSBridgeReady', jsApiCall); } }else{ jsApiCall(); } </script> </head> </html> 

eg: 處理微信支付結果異步回調

// 處理微信支付異步通知
// $res: 是否支付成功
// $notifyData: 異步通知的原始數據
// $replyData: 回覆微信異步通知的數據
list($res, $notifyData, $replyData) = $api->progressWxPayNotify();

// 處理業務邏輯
// ...

// 回覆微信
$api->replyWxPayNotify($replyData);
exit();

常見問題

  • redirect_uri參數錯誤 開發者中心->功能服務[網頁帳號:網頁受權獲取用戶基本信息]->修改->填寫回調的域名
  • 當前頁面的URl未註冊 微信支付->公衆號支付填寫支付受權目錄
  • 微信支付結果經過純post xml通知,但PHP7移除了 HTTP_RAW_POST_DATA,這裏使用 php://input

License

MIT

相關文章
相關標籤/搜索