首先进入composer官方网站,然后搜索phpqrcode安装包。
composer require aferrandini/phpqrcode
我用的是thinkphp框架,所以在用的时候我是使用命名空间的方式(可能是个废话,大家应该都懂)
use app\common\model\User;;
use app\common\model\Order;
use wxpay\database\WxPayResults;
use wxpay\database\WxPayUnifiedOrder;
use wxpay\database\WxPayOrderQuery;
use wxpay\NativePay;
use wxpay\WxPayApi;
use wxpay\WxPayConfig;
use Predis;
use PHPQRCode\QRcode;
我在控制器中创建了一个公用的生成二维码的方法,如下:
// 公用二维码生成
static function setQrcode($url){
//二维码图片保存路径
$pathname = date("Ymd",time());
$pathname = "./public/wxpay/qrcode/" . $pathname;
if(!is_dir($pathname)) { //若目录不存在则创建之
mkdir($pathname);
}
$qrcode = new QRcode();
//二维码图片保存路径(若不生成文件则设置为false)
$filename = $pathname . "/qrcode_" . randOrder() . ".png";
//二维码容错率,默认L
$level = "L";
//二维码图片每个黑点的像素,默认4
$size = \'10\';
//二维码边框的间距,默认2
$padding = 2;
//保存二维码图片并显示出来,$filename必须传递文件路径
$saveandprint = true;
//生成二维码图片
$qrcode->png($url,$filename,$level,$size,$padding,$saveandprint);
//二维码logo
$logo = "./public/wxpay/images/logo.png";
$QR = imagecreatefromstring(file_get_contents($filename));
$logo = imagecreatefromstring(file_get_contents($logo));
$QR_width = imagesx($QR);
$QR_height = imagesy($QR);
$logo_width = imagesx($logo);
$logo_height = imagesy($logo);
$logo_qr_width = $QR_width / 5;
$scale = $logo_width / $logo_qr_width;
$logo_qr_height = $logo_height / $scale;
$from_width = ($QR_width - $logo_qr_width) / 2;
imagecopyresampled($QR, $logo, $from_width, $from_width, 0, 0, $logo_qr_width, $logo_qr_height, $logo_width, $logo_height);
imagepng($QR,$filename);
return $filename;
}
}
然后在自己想要调用的地方直接调用这个方法。
protected function initialize(){
parent::initialize();
if (!self::islogin()){
$this->error(\'您需要登录后在进行操作\',\'user/login\');
}
$this->Order = new Order();
}
public function index(){
$product_id = (time()+1).createStr(22);
$notify = new NativePay();
$input = new WxPayUnifiedOrder();
$input->setBody("微信支付的东西");
$input->setAttach("xxx");
//$input->setOutTradeNo(WxPayConfig::MCHID.date("YmdHis"));
$input->setOutTradeNo($product_id);
$input->setTotalFee("1");//以分为单位,一般是要乘100的。
$input->setTimeStart(date("YmdHis"));
$input->setTimeExpire(date("YmdHis", time() + 600));
$input->setGoodsTag("test");
$input->setNotifyUrl(wxPayConfig::NOTIFY_URL);
$input->setTradeType("NATIVE");
//$product_id 为商品自定义id 可用作订单ID
$input->setProductId($product_id);
/*
$data = [
\'order_id\' => $input->getOutTradeNo(),
\'uid\' => session(\'uid\'),
\'amount\' => $input->getTotalFee(),
];
$res = db(\'order\')->insert($data);
*/
$result = $notify->getPayUrl($input);
if (empty($result[\'code_url\'])){
$qrCode_url = \'\';
}else{
$qrCode_url = $this->setQrcode($result[\'code_url\']);
}
return $this->fetch(\'\',[
\'qrCode_url\' => $qrCode_url,
\'product_id\' => $product_id,
]);
}
这个是结合微信的支付功能的二维码生成器,
下面这段代码是ajax回调支付是否成功的判断,redis在里面的操作以及一个微信支付的回调地址(最后一个暂时没有用)
/**
* 查看订单的状态
*/
public function orderstate(){
error_reporting(E_ERROR);
ini_set(\'date.timezone\',\'Asia/Shanghai\');
$transaction_id = $_REQUEST[\'transaction_id\'];
$out_trade_no = $_REQUEST[\'out_trade_no\'];
if(request()->param(\'transaction_id\') != null && request()->param(\'transaction_id\') != ""){
$input = new WxPayOrderQuery();
$input->setTransactionId($transaction_id);
if (WxPayApi::orderQuery($input)[\'trade_state\']===\'SUCCESS\'){
db(\'order\')->where(\'order_id\',$transaction_id)->update([\'ispay\'=>\'1\']);
}else{
// 支付失败
db(\'order\')->where(\'order_id\',$transaction_id)->update([\'ispay\'=>\'2\']);
}
return json(WxPayApi::orderQuery($input));
}
if(request()->param(\'out_trade_no\') != null && request()->param(\'out_trade_no\') != ""){
$input = new WxPayOrderQuery();
$input->setOutTradeNo($out_trade_no);
if (WxPayApi::orderQuery($input)[\'trade_state\']===\'SUCCESS\'){
db(\'order\')->where(\'order_id\',$out_trade_no)->update([\'ispay\'=>\'1\']);
}else{
db(\'order\')->where(\'order_id\',$out_trade_no)->update([\'ispay\'=>\'2\']);
}
return json(WxPayApi::orderQuery($input));
}
}
/**
* 微信支付 回调逻辑处理
* @return string
*/
public function notify(){
$wxData = file_get_contents("php://input");
//file_put_contents(\'/tmp/2.txt\',$wxData,FILE_APPEND);
try{
$resultObj = new WxPayResults();
$wxData = $resultObj->Init($wxData);
}catch (\Exception $e){
$resultObj ->setData(\'return_code\',\'FAIL\');
$resultObj ->setData(\'return_msg\',$e->getMessage());
return $resultObj->toXml();
}
if ($wxData[\'return_code\']===\'FAIL\'||
$wxData[\'return_code\']!== \'SUCCESS\'){
$resultObj ->setData(\'return_code\',\'FAIL\');
$resultObj ->setData(\'return_msg\',\'error\');
return $resultObj->toXml();
}
// TODO 根据订单号 out_trade_no 来查询订单数据
$out_trade_no = $wxData[\'out_trade_no\'];
//此处为举例
$input = new WxPayUnifiedOrder();
db(\'order\')->where(\'order_id\',$input->getOutTradeNo())->update([\'ispay\'=>\'1\']);
db(\'order\')->where(\'order_id\',$out_trade_no)->update([\'ispay\'=>\'2\']);
$order = db(\'order\')->where([\'order_id\' => $out_trade_no])->find();
if (!$order || $order->status == 1){
$resultObj ->setData(\'return_code\',\'SUCCESS\');
$resultObj ->setData(\'return_msg\',\'OK\');
return $resultObj->toXml();
}
//TODO 数据更新 业务逻辑处理 $order
}
// redis 的操作
public function myredis(){
$client = new Predis\Client([
\'scheme\' => \'tcp\',
\'host\' => config(\'redis.REDIS_HOST\'),
\'port\' => config(\'redis.REDIS_PORT\'),
\'password\' => config(\'redis.REDIS_AUTH\'),
\'database\' => 1,
]);
$client->set(\'han\',\'this is my name\');
$client->rpush(\'mylist\',[\'one\']);
$client->rpush(\'mylist\',[\'two\']);
$client->rpush(\'mylist\',[\'three\']);
$client->rpush(\'mylist\',[\'fore\']);
// 查看mylist中所有的数据
$valueAll = $client->lrange(\'mylist\',\'0\',\'-1\');
// 查找第二个push进去的数据
$value = $client->lindex(\'mylist\',\'-2\');
dump($valueAll);
}
最主要的前端代码出来了,快夸我无私吧兄弟们。
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport"
content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Javascript 二维码生成库:QRCode</title>
<script type="text/javascript" src="__STATIC__/js/jquery-3.3.1.min.js"></script>
<script type="text/javascript" src="__STATIC__/js/qrcode.min.js"></script>
</head>
<body>
<img id="img" src="/{$qrCode_url}" alt="" width="150px" />
<br />
<div class="onqr">
<input type="hidden" id="out_trade_no" value="{$product_id}" >
{:token()}
</div>
<script type="text/javascript">
// 产看订单状态
var time = setInterval("check()",3000); //3秒查询一次是否支付成功
function check() {
var url = "{:url(\'/index/Wxpay/orderstate\')}";
var out_trade_no = $("#out_trade_no").val();
var param = {\'out_trade_no\':out_trade_no};
$.post(url,param,function(data){
var obj = eval(data);
if (obj.trade_state == \'SUCCESS\') {
time = window.clearInterval(time);
$(".onqr").hide();
// 支付成功把二维码替换成支付成功图标
$("#img").attr(\'src\',\'/public/wxpay/images/success.png\');
console.log(obj);
}else{
console.log(obj);
}
});
}
</script>
</body>
</html>