构建方案:首先,创建一个二维码,并将需要处理的URL链接嵌入其中;其次,当用户扫描该二维码后,脚本将识别扫码设备;接着,根据识别结果,调用相应的支付流程;最后,若扫描成功后能够启动对应的应用程序,则支付宝应采用手机网站支付模式,而微信则需采用其他支付方式。
实现思路
效果展示
项目即将正式上线,因此我已将原有的支付二维码链接进行了更换。在生成新的二维码时,务必确保链接中包含http协议。
实现
步骤生成二维码
//我的url指向了checkTerrace方法 $url等于self::ADMIN_URL加上params等参数。 //ADMIN_URL是生成二维码的url,请替换成自己
处理用户扫码操作(方法)
公共方法:验证露台 { 此行代码中,$pay_type 变量被赋值为调用 $this->getPayType() 方法的结果,该方法旨在确定用户所使用的扫码支付终端类型。 $params = $this->request->get('params'); // 这些参数是构成二维码URL的一部分,根据具体需求而定,在我的项目中,我需要添加一些额外的信息。 我使用了desc加密对参数进行了处理,因此需要对参数进行解密操作,代码中通过调用desDecode方法实现了这一步骤,具体如下:$params = $this->desDecode($params);这样做是为了满足不同用户的需求。 若用户选择支付宝作为支付方式,且通过支付宝扫码进行相关操作,则: if ($params === false) { echo "系统错误!,请稍后重试"; exit; } 执行结果为:$res = $this->generateOrder($pay_type, $params); if (!$res) { echo "系统错误,请稍后重试"; exit; } $this->aliPay($res); } 若用户选择微信支付方式,且操作是通过微信扫描二维码完成的,{ if ($params === false) { echo "系统错误,请稍后重试"; exit; } 执行此操作时,我们首先调用wechat方法,传入pay_type和params参数,然后将返回的结果赋值给变量prepare。 将'json'变量赋值为$prepare准备的数据。 执行返回操作,展示名为“wpay.html”的视图文件。 若支付类型为空或不存在,{ echo "请使用支付宝或微信进行扫码"; exit; } }
判断扫码终端
/** * 判断扫码终端 * * @return string|boolean * @date 2021-02-04 */ private function getPayType() { 若检测到$_SERVER['HTTP_USER_AGENT']中包含'AlipayClient'字符串。 return "alipay"; } 若检测到$_SERVER['HTTP_USER_AGENT']中包含'MicroMessenger'字符串,{ return "wechat"; } else { return false; } }
生成订单
/** * 生成订单 * * @param string $pay_type * @param json $params * @return void * @date 2021-02-04 */ //这个逻辑就不贴代码了
支付宝支付
/** * 唤起支付宝app * * @param array $api_params * @return void * @date 2021-02-04 */ 定义一个私有函数,名为aliPay,该函数接受一个名为$api_params的参数。 { $config = [ 'notify_url' => '异步回调地址', 'is_open_certificate' => true ]; 将API参数中的域名进行URL编码处理,得到的结果赋值给变量$domain。 $api = [ 将订单号指定为API参数中的交易编号。 'total_amount' => '0.01', 'subject' => '商品标题', 'passback_params' => $domain ]; $pay = new Pay($config); 执行支付操作时,通过支付宝的驱动接口,选择了手机网站支付渠道,并成功调用了相关API接口,实现了支付流程。 echo $res; }
微信支付
/** * 唤起微信app * * @return void * @date 2021-02-04 */ 公开方法wechat接受两个参数,一个是支付类型$pay_type,另一个是参数集合$params。 { 在执行微信JSAPI支付操作前,必须首先调用方法获取用户的openID。 if (!$opend_id) { echo "微信授权失败..."; exit; } 成功获取用户openID之后,便执行订单生产流程,此时调用了createOrder方法,并传入支付类型和参数,最终生成了相应的api_params。 if (!$api_params) { echo "系统错误,请稍后重试"; exit; } 配置信息包括:通知URL设置为微信的异步回调地址。 $api = [ 'body' => '我是标题', 将订单号指定为API参数中的交易编号,即 'out_trade_no' => $api_params['trade_no']。 'total_fee' => 1, 'openid' => $opend_id, 将域名参数与API参数关联,即 $api_params['domain']。 ]; $pay = new Pay($config); 执行微信JSAPI支付操作,代码通过调用支付对象的wechat驱动和mp网关接口,成功进行了支付请求。 return $res; }
静默获取
/** * 获取用户的openid * * @return void * @date 2021-02-04 */ public function getOpenId() { 若存在$_SESSION['open_id']变量且其值非空,{ return $_SESSION['open_id']; } 若未获取到请求中的'code'参数。 此处设置的$redirect_uri变量,由$_SERVER数组中的请求协议、服务器域名和请求URI拼接而成,即:'http://'或'https://'加上'www.example.com'再加上当前请求的路径。此地址需在订单处理环节明确标注,若未在此处注明,程序在跳转至微信授权页面后,将导致脚本执行流程中断。 对重定向URI进行URL编码处理,使其符合规范。 该URL由以下部分构成:首先,是代码URL,接着添加了重定向URI,然后是应用ID,随后指定了作用域为snsapi_base,选择了响应类型为code,并加入了状态参数STATE,最后以#wechat_redirect结尾。这种构造方式是基于用户静默授权模式,因为不需要获取用户信息,所以没有采用用户授权模式。 执行跳转操作,引导用户至微信授权界面,目标地址为{$url}。 } else { 将openidurl赋值为openidUrl加上appid、appSecret、code以及grant_type,具体为:$openidurl = $this->openidUrl . 'appid=' . $this->appId . '&secret=' . $this->appSecret . '&code=' . $this->request->get('code') . '&grant_type=authorization_code'; 获取数据时,通过Http类调用了get方法,并将openidurl作为参数传入,从而得到了$data变量。 对传入的数据进行JSON解码,并将结果转换为关联数组。 if ($data['openid']) { 将获取到的用户openID信息存入session变量$_SESSION中,具体操作为将其赋值给$_SESSION['open_id']。 } else { $_SESSION['open_id'] = false; } return $_SESSION['open_id']; } }
前端轮询判断监听订单支付状态
$(function() { $("#code").qrcode({ //jQuery生成二维码 width: 165, //宽度 height: 167, //高度 获取页面中所有名为"url"的输入框的值。 }); 设定变量startTime,其值为当前日期转换为时间戳后除以1000的结果。 //设置定时器 定义了一个名为 poll_request 的变量,该变量通过 setInterval 函数设置了一个定时器,定时器执行一个匿名函数。 $.ajax({ 该链接地址为:/company/StoreSetting/checkStatus,请勿进行修改。 data:{time:startTime}, dataType:'json', type:'get', success:function(res) { if (res.code == 400) { 执行clearTimer函数,针对poll_request和startTime进行操作,得到的结果存储在变量result中。 if (result) { var html = ``+ `
前端效果:
用户进入支付页面但是一直为扫码,超过一定时间
用户扫码后一直未进行支付,超过一定时间
这篇文章对PHP如何实现一个兼容支付宝与微信支付功能的二维码进行了详细讲解,内容至此结束。如需了解更多关于PHP支付宝和微信支付的相关内容,请查阅自由互联过往的文章,或继续阅读下方的相关文章。期待大家今后继续支持自由互联!