微信支付&&二维码生成
首先进入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>

浙公网安备 33010602011771号