PHP项目快速接入微信功能

avatar
开发工程师 @西安众邦网络科技有限公司

一、使用composer安装EasyWeChat

传送:参考EasyWeChat文档

二、初始化SDK

在前面我们已经讲过,初始化SDK的时候方法就是创建一个 EasyWeChat\Foundation\Application 实例:

use EasyWeChat\Foundation\Application;
$options = [
   // ...];
$app = new Application($options);
/**
* 如果想要在Application实例化完成之后, 修改某一个options的值,
* 比如服务商+子商户支付回调场景, 所有子商户订单支付信息都是通过同一个服务商的$option 配置进来的,
* 当oauth在微信端验证完成之后, 可以通过动态设置merchant_id来区分具体是哪个子商户
*/$app['config']->set('oauth.callback','wechat/oauthcallback/'. $sub_merchant_id->id);

那么配置的具体选项有哪些,下面是一个完整的列表:

<?php
return [
    /**
     * Debug 模式,bool 值:true/false
     *
     * 当值为 false 时,所有的日志都不会记录
     */
    'debug'  => true,
    /**
     * 账号基本信息,请从微信公众平台/开放平台获取
     */
    'app_id'  => 'your-app-id',         // AppID
    'secret'  => 'your-app-secret',     // AppSecret
    'token'   => 'your-token',          // Token
    'aes_key' => '',                    // EncodingAESKey,安全模式与兼容模式下请一定要填写!!!
    /**
     * 日志配置
     *
     * level: 日志级别, 可选为:
     *         debug/info/notice/warning/error/critical/alert/emergency
     * permission:日志文件权限(可选),默认为null(若为null值,monolog会取0644)
     * file:日志文件位置(绝对路径!!!),要求可写权限
     */
    'log' => [
        'level'      => 'debug',
        'permission' => 0777,
        'file'       => '/tmp/easywechat.log',
    ],
    /**
     * OAuth 配置
     *
     * scopes:公众平台(snsapi_userinfo / snsapi_base),开放平台:snsapi_login
     * callback:OAuth授权完成后的回调页地址
     */
    'oauth' => [
        'scopes'   => ['snsapi_userinfo'],
        'callback' => '/examples/oauth_callback.php',
    ],
    /**
     * 微信支付
     */
    'payment' => [
        'merchant_id'        => 'your-mch-id',
        'key'                => 'key-for-signature',
        'cert_path'          => 'path/to/your/cert.pem', // XXX: 绝对路径!!!!
        'key_path'           => 'path/to/your/key',      // XXX: 绝对路径!!!!
        // 'device_info'     => '013467007045764',
        // 'sub_app_id'      => '',
        // 'sub_merchant_id' => '',
        // ...
    ],
    /**
     * Guzzle 全局设置
     *
     * 更多请参考: http://docs.guzzlephp.org/en/latest/request-options.html
     */
    'guzzle' => [
        'timeout' => 3.0, // 超时时间(秒)
        //'verify' => false, // 关掉 SSL 认证(强烈不建议!!!)
    ],];

使用EasyWeChat可以完成支付功能

你在阅读本文之前确认你已经仔细阅读了:微信支付 | 企业付款文档 。

配置在前面的例子中已经提到过了,支付的相关配置如下:

<?php
use EasyWeChat\Foundation\Application;
$options = [
    // 前面的appid什么的也得保留哦
    'app_id' => 'xxxx',
    // ...

    // payment
    'payment' => [
        'merchant_id'        => 'your-mch-id',
        'key'                => 'key-for-signature',
        'cert_path'          => 'path/to/your/cert.pem', // XXX: 绝对路径!!!!
        'key_path'           => 'path/to/your/key',      // XXX: 绝对路径!!!!
        'notify_url'         => '默认的订单回调地址',       // 你也可以在下单时单独设置来想覆盖它
        // 'device_info'     => '013467007045764',
        // 'sub_app_id'      => '',
        // 'sub_merchant_id' => '',
        // ...
    ],];
$app = new Application($options);
$payment = $app->payment;

创建订单

<?php
use EasyWeChat\Payment\Order;
$attributes = [
    'trade_type'       => 'JSAPI', // JSAPI,NATIVE,APP...
    'body'             => 'iPad mini 16G 白色',
    'detail'           => 'iPad mini 16G 白色',
    'out_trade_no'     => '1217752501201407033233368018',
    'total_fee'        => 5388, // 单位:分
    'notify_url'       => 'http://xxx.com/order-notify', // 支付结果通知网址,如果不设置则会使用配置里的默认地址
    'openid'           => '当前用户的 openid', // trade_type=JSAPI,此参数必传,用户在商户appid下的唯一标识,
    // ...];
$order = new Order($attributes);

统一下单

$result = $payment->prepare($order);
if ($result->return_code == 'SUCCESS' && $result->result_code == 'SUCCESS'){
$prepayId = $result->prepay_id;
}

支付结果通知 在用户成功支付后,微信服务器会向该 订单中设置的回调URL 发起一个 POST 请求,请求的内容为一个 XML。里面包含了所有的详细信息,具体请参考: 支付结果通用通知.

在本 SDK 中处理回调真的再简单不过了,请求验证你就不用管了,SDK 已经为你做好了,你只需要关注业务即可:

$response = $app->payment->handleNotify(function($notify, $successful){
    // 你的逻辑
    return true; // 或者错误消息});
$response->send(); // Laravel 里请使用:return $response;

使用EasyWeChat完成提现到零钱功能(企业付款到零钱)

你在阅读本文之前确认你已经仔细阅读了:微信支付 | 企业付款文档 。 与其他支付接口一样,企业支付接口也需要配置如下参数,需要特别注意的是,企业支付相关的全部接口 都需要使用 SSL 证书,因此 cert_path 以及 cert_key 必须正确配置。

<?php
use EasyWeChat\Foundation\Application;
$options = [
    'app_id' => 'your-app-id',
    // payment
    'payment' => [
        'merchant_id'        => 'your-mch-id',
        'key'                => 'key-for-signature',
        'cert_path'          => 'path/to/your/cert.pem',
        'key_path'           => 'path/to/your/key',
        // ...
    ],];
$app = new Application($options);
$merchantPay = $app->merchant_pay;

企业付款

企业付款使用的余额跟微信支付的收款并非同一账户,请注意充值。

<?php
$merchantPayData = [
        'partner_trade_no' => str_random(16), //随机字符串作为订单号,跟红包和支付一个概念。
        'openid' => $openid, //收款人的openid
        'check_name' => 'NO_CHECK',  //文档中有三种校验实名的方法 NO_CHECK OPTION_CHECK FORCE_CHECK
        're_user_name'=>'张三',     //OPTION_CHECK FORCE_CHECK 校验实名的时候必须提交
        'amount' => 100,  //单位为分
        'desc' => '企业付款',
        'spbill_create_ip' => '192.168.0.1',  //发起交易的IP地址
    ];
$result = $merchantPay->send($merchantPayData);

如同已上的两个功能一样,使用EasyWeChat就可以快速、简单的完成和微信相关的功能了。