PHP ThinkCMF框架使用EasyWechat微信小程序、移动以及pc扫码支付

  • 1.安装EasyWechat,根据文档提示:
    PHP ThinkCMF框架使用EasyWechat微信小程序、移动以及pc扫码支付_第1张图片
  • 2.配置文件设置好微信配置参数(文档有具体解释)
    PHP ThinkCMF框架使用EasyWechat微信小程序、移动以及pc扫码支付_第2张图片
  • 3.支付代码以及回调逻辑(需要用户的小程序openid,这个自己去微信文档查看,我这里是用户登录时就已经获取到,存在了数据库).
	/**
     * 小程序支付
     * token    用户token
     */
    public function small_pay()
    {
    	$user_id = user_decrypt(request()->param('token'));
        $payment = Factory::payment(config('wechat'));
        $order_no = request()->param('order_no');   //获取子订单号
        $order_info = Db::name('order_son') ->where('son_no',$order_no)->find();
        $money = $order_info['payment'];
        //获取用户openid
        $openid = Db::name('customer')->where('id',$user_id)->value('openid');
        $result = $payment->order->unify([
            'body' => '购买套餐',
            'out_trade_no' => $pay_no,
            'total_fee' => $money * 100,    //订单金额
            'spbill_create_ip' => '', // 可选,如不传该参数,SDK 将会自动获取相应 IP 地址
            'notify_url' => 'http://******/api/wechat/weChat_notify_url', // 支付结果通知网址,如果不设置则会使用配置里的默认地址
            'trade_type' => 'JSAPI', // 请对应换成你的支付方式对应的值类型
            'openid' => $openid,
        ]);

        $jssdk = $payment->jssdk;
        if ($result['return_code'] == 'SUCCESS' && $result['result_code']== 'SUCCESS'){
            $prepayId = $result['prepay_id'];
            $config = $jssdk->bridgeConfig($prepayId, false); // 返回数组
            return_json(1,'获取支付配置成功!',$config);
        }else{
            return_json(0,'获取支付配置失败');
        }
    }


	/**
     * Class WeChatPay
     * @package app\home\controller\user
     * 微信PC支付
     */
    public function weChat_page_pay()
    {
        $app = Factory::payment(config('wechat'));
        $order_no = request()->param('order_no');   //获取子订单号
        $order_id = request()->param('order_id');   //获取子订单id作为商品id
        $order_info = Db::name('order_son') ->where('son_no',$order_no)->find();
     
        $money = $order_info['payment'];
        $result = $app->order->unify([
            'body' => '购买套餐',
            'out_trade_no' => $pay_no,
            'total_fee' => $money*100,           //价格
            'spbill_create_ip' => '', // 可选,如不传该参数,SDK 将会自动获取相应 IP 地址
            'notify_url' => 'http://*****/api/wechat/weChat_notify_url', // 支付结果通知网址,如果不设置则会使用配置里的默认地址
            'trade_type' => 'NATIVE',     //扫码支付
            'product_id' =>$order_id, // $message['product_id'] 则为生成二维码时的产品 ID
        ]);
        // dump($result);exit;
        if ($result['return_code'] == 'SUCCESS' && $result['result_code']== 'SUCCESS'){

            return_json(1,'获取支付二维码成功',$result['code_url']);
        }else{
            return_json(0,'获取支付二维码失败');
        }

    }

	
	/**
     * 微信移动端支付(H5)
     */
    public function weChat_wap_pay(){

        $app = Factory::payment(config('wechat'));
        $order_no = request()->param('order_no');   //获取子订单号
        $order_info = Db::name('order_son') ->where('son_no',$order_no)->find();
        $money = $order_info['payment'];
        $result = $app->order->unify([
            'body' => '购买套餐',
            'out_trade_no' => $pay_no,
            'total_fee' => $money,           //价格
            'spbill_create_ip' => '', // 可选,如不传该参数,SDK 将会自动获取相应 IP 地址
            'notify_url' => 'http://*****/api/wechat/weChat_notify_url', // 支付结果通知网址,如果不设置则会使用配置里的默认地址
            'trade_type' => 'MWEB',
            'scene_info' => "{\"h5_info\": {\"type\":\"Wap\",\"wap_url\": \"https://laodongwuyou.com\",\"wap_name\": \"劳动无忧\"}}",//这个是H5支付场景所用
        ]);
        $redirect_url = '';//支付后跳转地址
        if ($result->return_code == 'SUCCESS' && $result->result_code == 'SUCCESS'){
            $mweb_url = $result->mweb_url . "&redirect_url=" . $redirect_url;//返回前台跳转支付的中间也,网址默认跳到发起支付的页面,加参数redirect_url后,跳到指定页面
            return_json(1,'调起支付成功',$mweb_url);
        }else{
            return_json(0,'调起支付失败');
        }
    }


/**
     * @throws \EasyWeChat\Kernel\Exceptions\Exception
     * 微信支付结果回调
     */
    public function weChat_notify_url()
    {
        $app = Factory::payment(config('wechat'));
        $response = $app->handlePaidNotify(function($message, $fail){
            // 使用通知里的 "微信支付订单号" 或者 "商户订单号" 去自己的数据库找到订单
            $pay_no = $message['out_trade_no'];
            //根据支付订单号获取平台支付订单号
            $order_number = Db::name('order_son')->where('pay_no',$pay_no)->value('son_no'
            if (!$order) { // 如果订单不存在 或者 订单已经支付过了
                return true; // 告诉微信,我已经处理完了,订单没找到,别再通知我了
            }
            if ($message['return_code'] === 'SUCCESS') { // return_code 表示通信状态,不代表支付状态
                // 否支用户是付成功
                if ($message['result_code'] === 'SUCCESS') {
                    
						**//处理你的订单逻辑**
                    
                   // 用户支付失败
                } else if ($message['result_code'] === 'FAIL') {
                    //目前不做订单状态的修改
                }
            } else {
                return $fail('通信失败,请稍后再通知我');
            }
            return true; // 返回处理完成
        });

        $response->send(); // return $response;
    }

如果在多终端同时有支付的话,支付的订单号得在生成支付配置之前进行更新,保证在不同终端的支付订单号不一样,微信才不会认为订单重复

你可能感兴趣的:(后台,PHP,微信支付)