EsayWechat+微信小程序支付开发的流程总结

naixiaoxin/think-wechat

基于EsayWechat开发的用于thinkphp框架的拓展包《EsayWechat微信支付文档》php

一、开始配置git

use Naixiaoxin\ThinkWechat\Facade;

$config = [
    // 必要配置
    'app_id'             => 'xxxx',//公众号AppID或小程序AppID,看支付场景
    'mch_id'             => 'your-mch-id',//商户号
    'key'                => 'key-for-signature',   // API 密钥

    // 如需使用敏感接口(如退款、发送红包等)须要配置 API 证书路径(登陆商户平台下载 API 证书)
    'cert_path'          => 'path/to/your/cert.pem', // XXX: 绝对路径!!!!
    'key_path'           => 'path/to/your/key',      // XXX: 绝对路径!!!!

    'notify_url'         => '默认的订单回调地址',     // 你也能够在下单时单独设置来想覆盖它
];

$payment= Factory::payment($config);

上面的配置信息,在安装完成扩展包以后会,可在Config/wechat.php配置文件中配置github

2.统一下单(文档连接)thinkphp

参数 appidmch_idnonce_strsignsign_type 可不用传入小程序

$result = $payment->order->unify([
    'body' => '腾讯充值中心-QQ会员充值',
    'out_trade_no' => '20150806125346',
    'total_fee' => 88,
    'spbill_create_ip' => '123.12.12.123', // 可选,如不传该参数,SDK 将会自动获取相应 IP 地址
    'notify_url' => 'https://pay.weixin.qq.com/wxpay/pay.action', // 支付结果通知网址,若是不设置则会使用配置里的默认地址
    'trade_type' => 'JSAPI', // 请对应换成你的支付方式对应的值类型
    'openid' => 'oUpF8uMuAJO_M2pxb1Q9zNjWeS6o',
]);

3.生成小程序调取支付须要的参数数组

JSSDK 模块用于生成调起微信支付以及共享收货地址的调用所需的配置参数(文档连接)php框架

$jssdk = $payment->jssdk;

$config = $jssdk->bridgeConfig($prepayId, false); // 返回数组

4.处理支付回调通知(文档连接)服务器

$response = $payment->handlePaidNotify(function ( $result , $fail ) {
            Log::write($result);//微信回调通知返回数据在$result
            //支付成功
            if ($result['result_code'] === 'SUCCESS') {
                $orderNO = $result['out_trade_no'];
                Db::startTrans();
                try {
                    $order = OrderModel::where('order_no' , '=' , $orderNO)->find();
                    //订单状态是未支付的才处理
                    if ($order['status'] == 1) {
                        $stockStatus = ( new OrderService() )->chenkOrderStock($order->id);
                        if ($stockStatus['pass']) {
                            $this->updateOrderStatus($order->id , true);
                            $this->reduceStock($stockStatus);
                        } else {
                            $this->updateOrderStatus($order->id , false);
                        }
                    }
                    Db::commit();
                    return true;
                } catch ( Exception $e ) {
                    Db::rollback();
                    Log::write($e);
                    return $fail('服务器处理失败,请稍后再通知我');//服务器处理出现异常须要返回给微信false,让他再次发起通知
                }
            //支付失败
            } else if ($result['result_code'] === 'FAIL') {
                //支付失败也须要返回true,表示服务器已处理,否则微信会反复通知,没有意义
                return true;
            }
        });

        $response->send();

注意:1.微信支付回调notify_url地址必须是真实服务器而且经过备案域名;经过ngrok能够本地开发调试统一下单、微信支付,小程序端能收到微信支付成功通知,可是服务器端,微信没有回调通知地址,致使没法处理后续流程,目前不肯定是否微信限制,项目在真实服务器,支付回调正常;微信