实现思路
- 生成一个二维码,加入要处理的url连接
- 在用户扫完码后,在对应的脚本中,判断扫码终端,调用相应的支付
- 若能够扫码之后能唤起相应app,支付宝要用手机网站支付方式,微信要使用jsapi支付方式
效果展示
提示: 因为项目即将上线,所以上面的支付二维码连接被我替换了(注意在生成二维码时加入的连接,要带上http协议)
实现
步骤生成二维码
//我的url指向了checkTerrace方法 $url = self::ADMIN_URL . 'params=' . $params; //ADMIN_URL是生成二维码的url,请替换成自己
处理用户扫码操作(checkTerrace方法)
public function checkTerrace() { $pay_type = $this->getPayType(); //该方法使用来判断用户扫码终端的 $params = $this->request->get('params'); //生成二维码url带的参数(看个人需求,我的项目需要额外参数) $params = $this->desDecode($params); //这里是因为我对参数进行了desc加密,看个人需求 if ($pay_type === 'alipay') { //如果用户是通过支付宝扫码,进行支付宝相关操作 if ($params === false) { echo "系统错误!,请稍后重试"; exit; } $res = $this->createOrder($pay_type, $params); if (!$res) { echo "系统错误,请稍后重试"; exit; } $this->aliPay($res); } elseif ($pay_type === 'wechat') { //如果用户是通过微信扫码,进行微信相关操作 if ($params === false) { echo "系统错误,请稍后重试"; exit; } $prepare = $this->wechat($pay_type, $params); $this->assign('json', $prepare); return $this->display('wpay.html'); } elseif ($pay_type === false) { echo "请使用支付宝或微信进行扫码"; exit; } }
判断扫码终端
/** * 判断扫码终端 * * @return string|boolean * @date 2021-02-04 */ private function getPayType() { if (strstr($_SERVER['HTTP_USER_AGENT'], 'AlipayClient')) { return "alipay"; } elseif (strstr($_SERVER['HTTP_USER_AGENT'], 'MicroMessenger')) { return "wechat"; } else { return false; } }
生成订单
/** * 生成订单 * * @param string $pay_type * @param json $params * @return void * @date 2021-02-04 */ //这个逻辑就不贴代码了 private function createOrder($pay_type, $params) { /*生成订单相关逻辑代码*/ }
支付宝支付
/** * 唤起支付宝app * * @param array $api_params * @return void * @date 2021-02-04 */ private function aliPay($api_params) { $config = [ 'notify_url' => '异步回调地址', 'is_open_certificate' => true ]; $domain = urlencode($api_params['domain']); $api = [ 'out_trade_no' => $api_params['trade_no'], 'total_amount' => '0.01', 'subject' => '商品标题', 'passback_params' => $domain ]; $pay = new Pay($config); $res = $pay->driver('alipay')->gateway('wap')->pay($api); //调用支付宝手机网站支付 echo $res; }
微信支付
/** * 唤起微信app * * @return void * @date 2021-02-04 */ public function wechat($pay_type, $params) { $opend_id = $this->getOpenId(); //处理微信jsapi支付之前,要先获取用户的openID if (!$opend_id) { echo "微信授权失败..."; exit; } $api_params = $this->createOrder($pay_type, $params); //用户openID获取成功后才进行订单生产操作 if (!$api_params) { echo "系统错误,请稍后重试"; exit; } $config = ['notify_url' => '微信异步回调地址']; $api = [ 'body' => '我是标题', 'out_trade_no' => $api_params['trade_no'], 'total_fee' => 1, 'openid' => $opend_id, 'attach' => $api_params['domain'] ]; $pay = new Pay($config); $res = $pay->driver('wechat')->gateway('mp')->pay($api); //调用微信jsapi支付 return $res; }
静默获取openID
/** * 获取用户的openid * * @return void * @date 2021-02-04 */ public function getOpenId() { if (isset($_SESSION['open_id']) && $_SESSION['open_id']) { return $_SESSION['open_id']; } if (!$this->request->get('code')) { $redirect_uri = $_SERVER['REQUEST_SCHEME'] . '://' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI']; //这里授权后微信跳转的地址,要写在订单处理处,否则会造成因为程序跳转到微信授权页面,导致脚本逻辑终止 $redirect_uri = urlencode($redirect_uri); $url = $this->codeUrl . 'redirect_uri=' . $redirect_uri . '&appid=' . $this->appId . '&scope=snsapi_base&response_type=code&state=STATE#wechat_redirect'; //使用用户静默授权模式(因为我不需要获取用户信息所有就没采用用户手段授权模式) header("location:{$url}"); //跳转到微信授权页面 } else { $openidurl = $this->openidUrl . 'appid=' . $this->appId . '&secret=' . $this->appSecret . '&code=' . $this->request->get('code') . '&grant_type=authorization_code'; $data = Http::get($openidurl); $data = json_decode($data, true); if ($data['openid']) { $_SESSION['open_id'] = $data['openid']; //获取到的用户openID存储到session中 } else { $_SESSION['open_id'] = false; } return $_SESSION['open_id']; } }
前端轮询判断监听订单支付状态
$(function() { $("#code").qrcode({ //jQuery生成二维码 width: 165, //宽度 height: 167, //高度 text: $('input[name="url"]').val() }); var startTime = Date.parse(new Date())/1000; //设置定时器 var poll_request = setInterval( function() { $.ajax({ url: '/company/StoreSetting/checkStatus', data:{time:startTime}, dataType:'json', type:'get', success:function(res) { if (res.code == 400) { var result = clearTimer(poll_request, startTime); if (result) { var html = `<img src="/UploadFiles/2021-04-02/paybg.png">前端效果:
用户进入支付页面但是一直为扫码,超过一定时间
用户扫码后一直未进行支付,超过一定时间
华山资源网 Design By www.eoogi.com
广告合作:本站广告合作请联系QQ:858582 申请时备注:广告合作(否则不回)
免责声明:本站资源来自互联网收集,仅供用于学习和交流,请遵循相关法律法规,本站一切资源不代表本站立场,如有侵权、后门、不妥请联系本站删除!
免责声明:本站资源来自互联网收集,仅供用于学习和交流,请遵循相关法律法规,本站一切资源不代表本站立场,如有侵权、后门、不妥请联系本站删除!
华山资源网 Design By www.eoogi.com
暂无评论...
更新日志
2024年11月13日
2024年11月13日
- 群星.1996-风月电影原声带【滚石】【WAV+CUE】
- Blast Slam S1参赛名单出炉:XG被直邀
- 《英雄联盟》Doinb想让Tian当教练:世纪大和解?
- 《忆蚀》Subliminal:揭秘后室之谜,路知行献声Weplay文化展
- 那英《征服NEWXRCD台湾版》日本压制[WAV+CUE]
- 群星《金曲百分百上》3CD(香港版)[WAV+CUE]
- 刘欢《雨中的树(新歌加精选)2CD》德国HD24K金碟[WAV+CUE]
- 郑源 《世间情歌》6N纯银SQCD[WAV+CUE][1G]
- 群星《粤潮2HQII》头版限量编号[低速原抓WAV+CUE][991M]
- 群星《2023好听新歌21》十倍音质 U盘音乐[WAV分轨][1G]
- 《热血传奇》双11感恩回馈 超值狂欢30天
- 原神5.2版本活动汇总 5.2版本活动有哪些
- 张敬轩.2010-NO.ELEVEN【环球】【WAV+CUE】
- 黄丽玲.2006-失恋无罪【艾回】【WAV+CUE】
- 阿达娃.2024-Laluna【W8VES】【FLAC分轨】