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

naixiaoxin/think-wechat

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

1、开始配置

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配置文件中配置

2.统一下单(文档链接)

参数 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 模块用于生成调起微信支付以及共享收货地址的调用所需的配置参数(文档链接)


$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可以本地开发调试统一下单、微信支付,小程序端能收到微信支付成功通知,但是服务器端,微信没有回调通知地址,导致无法处理后续流程,目前不确定是否微信限制,项目在真实服务器,支付回调正常;

转载于:https://my.oschina.net/u/4094683/blog/3064687

你可能感兴趣的:(EsayWechat+微信小程序支付开发的流程总结)