微信扫码支付

微信扫码支付(laravel)

1.未开通微信扫码支付

(1).参照微信扫码支付接入步骤

(2).开通成功之后用分配的商户号登录微信商户平台设置扫码支付的异步回调地址(注意:是返给商户后台的回调地址)

2.已经开通扫码支付

模式二:

业务流程:参照微信支付文档模式二

代码贴上:

<?php
namespace App\Http\Controllers\Dsp;use App\DspAccount;
use App\DspUser;
use App\StarShow\AliPay;
use App\StarShow\Qrcode;
use App\StarShow\WechatPay;
use Illuminate\Http\Request;
use Log;
use StarShowResponse;
use Validator;class AccountController extends Controller {protected $alipay;protected $wechat;protected $qrcode;public function __construct(AliPay $alipay, WechatPay $wechat, Qrcode $qrcode) {$this->alipay = $alipay;$this->wechat = $wechat;$this->qrcode = $qrcode;}//dsp项目充值public function recharge(Request $request, $user_id) {$validator = Validator::make($request->all(), ['total_amount' => 'required','payment_type' => 'required',]);if ($validator->fails()) {return StarShowResponse::response($validator->errors()->first(), 422);}//$user_id = $request->input('user_id');$total_amount = $request->input('total_amount');$payment_type = $request->input('payment_type');//账户余额$account_balance = DspUser::find($user_id)->account;//->select("select * from users where user_id=" . $user_id);$out_trade_no = date('YmdHis') . rand(0, 9);$account = DspAccount::create(['user_id' => $user_id,'payment_type' => $payment_type,'account_balance' => $account_balance,'name' => 'DSP账户充值','out_trade_no' => $out_trade_no,'total_amount' => $total_amount,]);switch ($payment_type) {case 1: //微信$params = array('appid' => config('wechat.app_id'),'mch_id' => config('wechat.mch_id'),'nonce_str' => str_random(16),'body' => '时尚星秀-DSP充值','out_trade_no' => $out_trade_no,'total_fee' => $total_amount * 100, //微信支付单位为分'time_start' => date("YmdHis"),'time_expire' => date("YmdHis", time() + 300),'spbill_create_ip' => $_SERVER['SERVER_ADDR'],'notify_url' => config('weixin.dsp_notify_url'),'trade_type' => 'NATIVE','product_id' => $out_trade_no,);Log::info('订单失效时间' . $params['time_expire']);$params['sign'] = $this->wechat->getSign($params, true);$rst = $this->wechat->curl_post_ssl('https://api.mch.weixin.qq.com/pay/unifiedorder', $this->wechat->arrayToXml($params));$result = $this->wechat->xmlToArray($rst);if (array_key_exists("return_code", $result) &&array_key_exists("result_code", $result) &&$result["return_code"] == "SUCCESS" &&$result["result_code"] == "SUCCESS") {$url = $result["code_url"];$code_url = $this->qrcode->generate($url);Log::info('二维码' . env('APP_HOST') . $code_url);$data = ['code_url' => env('APP_HOST') . $code_url,'out_trade_no' => $out_trade_no,'time_expire' => date('Y-m-d H:i:s', strtotime($params['time_expire'])),];return StarShowResponse::response($data, 200);} else {return StarShowResponse::response($result["return_msg"], 500);}break;case 2: //支付宝$res = $this->alipay->tradePagePay($out_trade_no, $total_amount);return $res;break;}}
}

Alipay.php

<?php
namespace App\StarShow;
header("Content-type:text/html;charset=utf-8");
require_once 'AliSign/AopSdk.php';
require_once 'AliSign/service/AlipayTradeService.php';
require_once 'AliSign/buildermodel/AlipayTradePagePayContentBuilder.php';
/**
* alipay pay class
*/
class AliPay {
public $private_key = '';
public $alipay_public_key = '';
//签名方式
public $signtype = "RSA";
//电脑网页支付
public function tradePagePay($out_trade_no, $total_amount) {
//支付宝配置
$config = config('latrell-alipay-web');
$config['private_key'] = $this->private_key;
$config['alipay_public_key'] = $this->alipay_public_key;
//构造参数
$payRequestBuilder = new \AlipayTradePagePayContentBuilder();
//商品描述,可空
$payRequestBuilder->setBody('充值');
//订单名称,必填
$payRequestBuilder->setSubject('账户充值');
$payRequestBuilder->setTotalAmount($total_amount);
$payRequestBuilder->setOutTradeNo($out_trade_no);
$aop = new \AlipayTradeService($config);
$response = $aop->pagePay($payRequestBuilder, $config['return_url'], $config['notify_url']);
// 跳转到支付页面。
return $response;
}
}

phpqrcode.php 文件在下载的微信支付demo里面就有

贴上二维码图片文件生成代码:

<?php
namespace App\StarShow;
require_once 'Phpqrcode/phpqrcode.php';/****/
class Qrcode {public function generate($text) {error_reporting(E_ERROR);$url = urldecode($text);$PNG_TEMP_DIR = getcwd() . '/temp/';if (!file_exists($PNG_TEMP_DIR)) {mkdir($PNG_TEMP_DIR);}$filename = 'test' . md5($url . '|L|4') . '.png';\QRcode::png($url, $PNG_TEMP_DIR . $filename, 'L', 4, 2);return '/temp/' . $filename;}
}


本人遇到的问题是选择微信支付之后直接生成了二维码,扫码之后没有任何反应;故改变二维码的生成策略;选择支付方式为微信支付之后,点击去支付,此时后台生成一个二维码图片+订单号+订单失效时间+服务器当前时间一起返给前端,这个时候前端做的处理是遮罩层弹出二维码,从弹出二维码那一刻前端根据订单失效时间-服务器当前时间=时间差 用这个时间差做一个2-3s定时请求后台的处理,根据订单号来定时请求后台查看支付结果,在失效时间结束之前如果支付成功则做各自的业务处理,如果失败则继续请求直到失效时间结束,如果用户关闭页面则不在验证。

有问题可以联系qq:1275920140

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/412260.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[vue] 怎么使css样式只在当前组件中生效?

[vue] 怎么使css样式只在当前组件中生效&#xff1f; <style scoped> </style> 个人简介 我是歌谣&#xff0c;欢迎和大家一起交流前后端知识。放弃很容易&#xff0c; 但坚持一定很酷。欢迎大家一起讨论 主目录 与歌谣一起通关前端面试题

linux 2行数据为一条记录 该如何操作这一条记录_Linux 日志文件系统原来是这样工作的...

文件系统要解决的一个关键问题是怎样防止掉电或系统崩溃造成数据损坏&#xff0c;在此类意外事件中&#xff0c;导致文件系统损坏的根本原因在于写文件不是原子操作&#xff0c;因为写文件涉及的不仅仅是用户数据&#xff0c;还涉及元数据(metadata)包括 Superblock、inode bit…

[vue] v-for循环中key有什么作用?

[vue] v-for循环中key有什么作用&#xff1f; 四个字: 性能优化,简述: 让vue在更新数据的时候可以更有针对性的个人简介 我是歌谣&#xff0c;欢迎和大家一起交流前后端知识。放弃很容易&#xff0c; 但坚持一定很酷。欢迎大家一起讨论 主目录 与歌谣一起通关前端面试题

JMeter - 如何创建可重用和模块化测试脚本

概述&#xff1a; 我的应用程序几乎没有业务关键流程&#xff0c;我们可以从中提出不同的业务工作流程。当我试图在JMeter中提出性能测试脚本时&#xff0c;我需要找到一些方法来创建可重用/模块化的测试脚本。这样我就可以创建不同的工作流程。 对于Ex&#xff1a; 让我们考虑…

请求支付宝渠道报错:40006,Insufficient Permissions,ISV权限不足

错误描述&#xff1a; 申请的是支付宝2.0产品&#xff08;如何区分支付宝产品是1.0还是2.0&#xff09;&#xff0c;请求支付宝渠道时&#xff0c;报错&#xff1a; {"code":"40006","msg":"Insufficient Permissions","sub_code…

dll放在unity哪个文件夹下_unity中调用dll文件总结

unity中调用dll文件总结根据收集的资料&#xff0c;对unity中调用dll文件进行总结&#xff0c;目前常用的两种&#xff0c;在给出vs中封装dll文件的步骤。一、调用c#中的dll文件1.1封装dll文件首先新建一个项目然后创建一个类库&#xff0c;例如命名为Csharpusing System;using…

[vue] watch和计算属性有什么区别?

[vue] watch和计算属性有什么区别&#xff1f; 一个是侦听属性&#xff0c;一个是计算属性 2.一个是为了应对复杂的逻辑计算&#xff0c;一个是对数据的变化作出反应 3.一个是只有当缓存改变时才执行&#xff0c;一个是只要从新渲染就会执行 4.一个有缓存&#xff0c;一个没有…

如何将阿里云的数据库备份RDS文件在本地恢复

1.首先把RDS文件下载到本地&#xff0c;我的备份文件3.5G(下载时间6分钟)&#xff1b; 压缩包&#xff1a; hins2448103_data_20180127044633.tar.gz 2.解压下载的RDS压缩包&#xff1a; tar -xzvf hins2448103_data_20180127044633.tar.gz 解压完是一个一个的数据库文件夹…

idea中lombok的使用

1.安装插件 在File-Setting-Plugins-Browse Repostitories中搜索Lombok Plugin插件安装 安装完成先别急着重启&#xff0c;继续设置&#xff0c;在File-Setting-Build, Execution, Deployment-Compiler-Annotation Processors中点击Enable annotation processors 确定后重启ide…

是隐极电机_资料 | 发电机定子绕组端部动态特性试验详解

一、试验目的大型汽轮发电机运行过程中&#xff0c;定子端部受二倍工频(100Hz)的电磁激振力。如果定子端部的模态接近100Hz&#xff0c;将发生谐振&#xff0c;从而可能因振幅过大而发生结构松动、磨损、绝缘损坏等现象&#xff0c;甚至断裂等故障&#xff0c;严重威胁机组的安…

[vue] 为什么data属性必须声明为返回一个初始数据对应的函数呢?

[vue] 为什么data属性必须声明为返回一个初始数据对应的函数呢&#xff1f; 对象为引用类型&#xff0c;当重用组件时&#xff0c;由于数据对象都指向同一个data对象&#xff0c;当在一个组件中修改data时&#xff0c;其他重用的组件中的data会同时被修改&#xff1b;而使用返…

Mac系统xampp环境下安装redis和phpredis

一、安装redis服务 通过homebrew安装redis sudo brew install redis 安装Homebrew mac下redis简单命令 1.安装命令 brew install redis 2.启动Redis命令 redis-server /usr/local/etc/redis.conf 3.停止redis server服务 redis-cli shutdown 4.退出redis server服务 C…

[导入]在C++ Builder3下实现程序自动运行的方法

文章来源:http://blog.csdn.net/nm/archive/2000/08/10/4403.aspx 转载于:https://www.cnblogs.com/zhaoxiaoyang2/archive/2000/08/10/816562.html

[vue] 说说你对keep-alive的理解是什么?

[vue] 说说你对keep-alive的理解是什么&#xff1f; keep-alive是Vue提供的一个抽象组件&#xff0c;用来对组件进行缓存&#xff0c;从而节省性能&#xff0c;由于是一个抽象组件&#xff0c;所以在页面渲染完毕后不会被渲染成一个DOM元素个人简介 我是歌谣&#xff0c;欢迎…

Problem01 不死神兔

题目&#xff1a;有一对兔子&#xff0c;从出生后第3个月起每个月都生一对兔子&#xff0c;小兔子长到第三个月后每个月又生一对兔子&#xff0c;假如兔子都不死&#xff0c;问每个月的兔子对数为多少&#xff1f; 程序分析&#xff1a;兔子的规律为数列1,1,2,3,5,8,13,21.... …

中动态路径加载_GOT段在linux系统中实现代码动态加载的作用和其他段的说明

上一节我们看到&#xff0c;当程序想调用系统函数时&#xff0c;在编译阶段无法确认被调用函数所在的虚拟地址。因此必须有机制让程序在运行过程中&#xff0c;在调用系统API的时候有办法去确定所调用的系统函数对应的入口地址&#xff0c;这就是代码运行时对应动态加载的过程。…

构件化软件生产

前面提到的是个人理想&#xff0c;那个是远景的。近期能够触摸到的就是构件化的软件生产了。先摘抄一句我非常喜欢的话&#xff1a;“软件工厂一定不是源代码拼装起来的&#xff0c;而是目标代码拼装出来的。就像零件生产一样&#xff0c;给你一个螺丝就可以拧上&#xff0c;而…

[vue] 你有写过自定义组件吗?

[vue] 你有写过自定义组件吗&#xff1f; 写过&#xff0c;随便说点组件的引入问题、注册问题、传值问题吧个人简介 我是歌谣&#xff0c;欢迎和大家一起交流前后端知识。放弃很容易&#xff0c; 但坚持一定很酷。欢迎大家一起讨论 主目录 与歌谣一起通关前端面试题

GitLab结合Eclipse的简单使用 - 20190211

需求&#xff1a; 移动端的值班经理视图调用了三个接口&#xff0c;需要在移动段的应用下加上三个接口的路由&#xff0c;分别是&#xff1a; /xxx-mvc/dutyView/getProviderSysDeal /xxx-mvc/dutyView/getSysAlarmData /xxx-mvc/dutyView/getSysStaffInfo package com.xxx.xxx…

单片机shell命令_MCU调试大法:使用串口实现简单shell功能

MCU调试大法&#xff1a;使用串口实现简单shell功能[复制链接]MCU程序调试方法有很多&#xff0c;比如软/硬件仿真、添加数据打印等。像Keil MDK就支持不少单片机的软件仿真&#xff0c;在没有拿到单片机的情况下&#xff0c;就可以先仿真调试部分功能&#xff0c;查看代码逻辑…