今天我讲讲微信支付,相信很多小伙伴接触到微信支付,微信支付需要哪些条件,需要准备什么呢?我们今天来介绍一下

1、微信支付需要的条件

     (1)、需要有一个认证过了的微信服务号。

    (2)、需要有一台国内云服务器,并且网站必须进行备案。(云服务器优惠链接)

2、实现微信支付前的准备   

    (1)、以公司或(个体工商户)的身份申请一服务号,并进行人证。

    (2)、以公司或(个体工商户)对实现微信支付的网站备案

    (3)、登录微信公众平台服务号进行相关设置

    (4)、登录微信公众平台:https://mp.weixin.qq.com/

    (5)、如图,点击微信支付---》支付申请

提交相应资料审核通过

(6)、开发设置:商户平台>产品中心>开发配置 >填写回调网址

(7)、学习使用官方教程

    (1 、使用教程-》扫码支付-》模式二

(2 、下载SDK与DEMO下载

3、thinkphp5中引入微信支付库文件

    (1)、微信SDK库的引入

   (2)、把下载的微信sdk库放到tp5的extend文件件,然后重新命一下名,我这里改为wxpay,文件夹里的文件无需做任何改动。

   (3)、我们用到的微信sdk的demo代码(在wxpay/example/Native.php里面模式二):


ini_set('date.timezone','Asia/Shanghai');
//error_reporting(E_ERROR);

require_once "../lib/WxPay.Api.php";
require_once "WxPay.NativePay.php";
require_once 'log.php';

//模式一
/**
 * 流程:
 * 1、组装包含支付信息的url,生成二维码
 * 2、用户扫描二维码,进行支付
 * 3、确定支付之后,微信服务器会回调预先配置的回调地址,在【微信开放平台-微信支付-支付配置】中进行配置
 * 4、在接到回调通知之后,用户进行统一下单支付,并返回支付信息以完成支付(见:native_notify.php)
 * 5、支付完成之后,微信服务器会通知支付成功
 * 6、在支付成功通知中需要查单确认是否真正支付成功(见:notify.php)
 */
$notify = new NativePay();
$url1 = $notify->GetPrePayUrl("123456789");

//模式二
/**
 * 流程:
 * 1、调用统一下单,取得code_url,生成二维码
 * 2、用户扫描二维码,进行支付
 * 3、支付完成之后,微信服务器会通知支付成功
 * 4、在支付成功通知中需要查单确认是否真正支付成功(见:notify.php)
 */
$input = new WxPayUnifiedOrder();
$input->SetBody("test");
$input->SetAttach("test");
$input->SetOut_trade_no(WxPayConfig::MCHID.date("YmdHis"));
$input->SetTotal_fee("1");
$input->SetTime_start(date("YmdHis"));
$input->SetTime_expire(date("YmdHis", time() + 600));
$input->SetGoods_tag("test");
$input->SetNotify_url("http://paysdk.weixin.qq.com/example/notify.php");
$input->SetTrade_type("NATIVE");
$input->SetProduct_id("123456789");
$result = $notify->GetPayUrl($input);
$url2 = $result["code_url"];
     (4)、我们要官方Native.php里面用到的库引入到我们的application\index\controller的index控制中代码如下:
<?php
namespace app\index\controller;
use think\Controller;
use think\Image;
use think\Request;
class Index extends Controller
{
    // 文件上传表单
    public function index()
    {
       //生成二维码的库,我们前面讲过
        include EXTEND_PATH . 'phpqrcode/phpqrcode.php';
        //原生态引入微信sdk的库
        include EXTEND_PATH . 'wxpay/lib/WxPay.Api.php';
        include EXTEND_PATH . 'wxpay/example/WxPay.NativePay.php';
 
    }
    
}

4、thinkphp5中调用库文件生成支付二维码

    (1)、在我们的控制器中添加生成支付的二维码的代码如下:


<?php
namespace app\index\controller;
use think\Controller;
use think\Image;
use think\Request;
class Index extends Controller
{
    // 文件上传表单
    public function index()
    {
        include EXTEND_PATH . 'phpqrcode/phpqrcode.php';
        include EXTEND_PATH . 'wxpay/lib/WxPay.Api.php';
        include EXTEND_PATH . 'wxpay/example/WxPay.NativePay.php';
        $input = new \WxPayUnifiedOrder();//统一下单输入对象
        $notify = new \NativePay();

        $input->SetBody("test");//设置商品或支付单简要描述

        $input->SetAttach("test");//* 设置附加数据,在查询API和支付通知中原样返回,该字段主要用于商户携带订单的自定义数据

        $input->SetOut_trade_no(\WxPayConfig::MCHID.date("YmdHis"));//设置商户系统内部的订单号,32个字符内、可包含字母, 其他说明见商户订单号

        $input->SetTotal_fee("1");//设置订单总金额,单位为分,只能为整数,详见支付金额

        $input->SetTime_start(date("YmdHis"));//设置订单生成时间,格式为yyyyMMddHHmmss,如2009年12月25日9点10分10秒表示为20091225091010。详见时间规则

        $input->SetTime_expire(date("YmdHis", time() + 600));//设置订单失效时间,格式为yyyyMMddHHmmss,如2009年12月27日9点10分10秒表示为20091227091010。详见时间规则

        $input->SetGoods_tag("test");//设置商品标记,代金券或立减优惠功能的参数,说明详见代金券或立减优惠

        $input->SetNotify_url("http://paysdk.weixin.qq.com/example/notify.php");//设置接收微信支付异步通知回调地址
        $input->SetTrade_type("NATIVE");//设置取值如下:JSAPI,NATIVE,APP,详细说明见参数规定

        $input->SetProduct_id("123456789");//设置商品ID

        $result = $notify->GetPayUrl($input);//* 生成直接支付url,支付url有效期为2小时,模式

        $url2 = $result["code_url"];
       
        // 引入生成二维码的类库
        
        // 设置保存二维码文件路径
        $id=time();
        $qrcode = ROOT_PATH . 'public/static/erweima/'.$id.'.png';
        
         //二维码带的参数$url
         $url = $url2;
         
         //生成二维码的函数
        \QRcode::png($url, $qrcode, 'Q');
        
        // 获取二维码的图片信息
         echo ' <img src="static/erweima/'.$id.'.png" alt="">';
    }
    
}
(2)、修改账号信息文件(wxpay/lib/WxPay.Config.php)
//=======【基本信息设置】=====================================
	//
	/**
	 * TODO: 修改这里配置为您自己申请的商户信息
	 * 微信公众号信息配置
	 * 
	 * APPID:绑定支付的APPID(必须配置,开户邮件中可查看)
	 * 
	 * MCHID:商户号(必须配置,开户邮件中可查看)
	 * 
	 * KEY:商户支付密钥,参考开户邮件设置(必须配置,登录商户平台自行设置)
	 * 设置地址:https://pay.weixin.qq.com/index.php/account/api_cert
	 * 
	 * APPSECRET:公众帐号secert(仅JSAPI支付的时候需要配置, 登录公众平台,进入开发者中心可设置),
	 * 获取地址:https://mp.weixin.qq.com/advanced/advanced?action=dev&t=advanced/dev&token=2005451881&lang=zh_CN
	 * @var string
	 */
	const APPID = '改成你公众号的appid';
    const MCHID = '你的商户号';
    const KEY = '你的商户支付密钥';
    const APPSECRET = '微信密钥';
    const NOTIFY_URL = '';

(3)、上传至网站云服务器就可以出现支付二维码了

5、thinkphp5把订单写入数据库

    (1)、订单表的前端代码

    

<!doctype html>
<html>
<head>
<meta charset="UTF-8">
<title>购物</title>
</head>
<body>
<h2>购物</h2>
<form method="post"  action="{:url('index')}">
商品名称:<input type="text"  name="name"><br/>
商品价格:<input type="text"  name="price"><br/>
<input type="submit" class="btn" value=" 提交 ">
</form>
</body>
</html>

     (2)、订单表的控制代码:


<?php
namespace app\index\controller;
use think\Controller;
use think\Image;
use think\Request;
class Index extends Controller
{
    // 文件上传表单
    public function index()
    {
        include EXTEND_PATH . 'phpqrcode/phpqrcode.php';
        include EXTEND_PATH . 'wxpay/lib/WxPay.Api.php';
        include EXTEND_PATH . 'wxpay/example/WxPay.NativePay.php';
        include EXTEND_PATH . 'wxpay/example/log.php';
         $data = input('post.');
         $name= $data['name'];
         $trade_no=date("YmdHis");
         $price= $data['price'];
         $product_id=rand(1,1000);
         $datas = [
        'name' =>  $name,
        'trade_no' =>  $trade_no,
        'price' => $price,
        'product_id' => $product_id,    
        ];
        $ids = model('Deal')->add($datas);
        $input = new \WxPayUnifiedOrder();//统一下单输入对象
        $notify = new \NativePay();

        $input->SetBody($name);//设置商品或支付单简要描述

        $input->SetAttach("test22");//* 设置附加数据,在查询API和支付通知中原样返回,该字段主要用于商户携带订单的自定义数据

        $input->SetOut_trade_no($trade_no);//设置商户系统内部的订单号,32个字符内、可包含字母, 其他说明见商户订单号

        $input->SetTotal_fee($price);//设置订单总金额,单位为分,只能为整数,详见支付金额

        $input->SetTime_start(date("YmdHis"));//设置订单生成时间,格式为yyyyMMddHHmmss,如2009年12月25日9点10分10秒表示为20091225091010。详见时间规则

        $input->SetTime_expire(date("YmdHis", time() + 600));//设置订单失效时间,格式为yyyyMMddHHmmss,如2009年12月27日9点10分10秒表示为20091227091010。详见时间规则

        $input->SetGoods_tag("test");//设置商品标记,代金券或立减优惠功能的参数,说明详见代金券或立减优惠

        $input->SetNotify_url("http://weixinzhifu.dezhouyilian.com/index/pay/notify");//设置接收微信支付异步通知回调地址
        $input->SetTrade_type("NATIVE");//设置取值如下:JSAPI,NATIVE,APP,详细说明见参数规定

        $input->SetProduct_id($product_id);//设置商品ID

        $result = $notify->GetPayUrl($input);//* 生成直接支付url,支付url有效期为2小时,模式

        $url2 = $result["code_url"];
        
        // 设置保存二维码文件路径
        $id=time();
        $qrcode = ROOT_PATH . 'public/static/erweima/'.$id.'.png';
        
         //二维码带的参数$url
         $url = $url2;
         
         //生成二维码的函数
        \QRcode::png($url, $qrcode, 'Q');
         $erweima ='/static/erweima/'.$id.'.png';

        // 获取二维码的图片信息
         return $this->fetch('', [
            'erweima' => $erweima,
            'ids' => $ids,

        ]);
    }  

    public function deal()
    {    
       
         return $this->fetch();
    }  
   
}
(3)、数据库处理代码:
<?php
namespace app\index\model;
use think\Model;
class Deal extends Model
{
    public function add($datas) {
        $datas['pay_status'] = 0;
        $this->save($datas);
        return $this->id;

    }
     
    public function updatePay($outTradeNo, $weixindata) {
        if(!empty($weixindata['transaction_id'])) {
            $data['transaction_id'] = $weixindata['transaction_id'];
            $data['pay_status'] = 1;
        }
        return $this->allowField(true)
            ->save($data, ['trade_no' =>$outTradeNo]);
    }


}

6、thinkphp5微信支付异步回调修改订单处理

    (1)、异步回调控制代码

    

<?php
namespace app\index\controller;
use think\Controller;
use think\Image;
use think\Request;
class Pay extends Controller
{
    // 文件上传表单
    public function notify()
    { 
    include EXTEND_PATH . 'wxpay/lib/WxPay.Api.php';
    include EXTEND_PATH . 'wxpay/lib/WxPay.Notify.php'; 
    $xml = file_get_contents("php://input");
    $data = \WxPayResults::Init($xml);
    //dump($data);exit;
    if (!array_key_exists("transaction_id", $data)) {
        return $this->toXML(['return_code' => 'FAIL', 'return_msg' => '参数错误']);
    }
    //查询订单,判断订单真实性
    if (!$data["out_trade_no"] || !$this->Queryorder($data["transaction_id"])) {
        return $this->toXML(['return_code' => 'FAIL', 'return_msg' => '订单真实性存疑']);
    }
    $outTradeNo = $data['out_trade_no'];
     $pay = model('Deal')->get(['trade_no' => $outTradeNo]);
     if (!$pay) {
         return $this->toXML(['return_code' => 'FAIL', 'return_msg' => '订单不存在']);
     }
     if($pay->pay_status == 1) {
           return $this->toXML(['return_code' => 'SUCCESS', 'return_msg' => 'OK']);
        }
   try {
        $payrRes = model('DeaL')->updatePay($outTradeNo, $data);
        } catch (\Exception $e) {
           return false;
        }
    return $this->toXML(['return_code' => 'SUCCESS', 'return_msg' => 'OK']);
}

/// 查询订单
 
  private function Queryorder($transaction_id)
  {
    $input = new \WxPayOrderQuery();
    $input->SetTransaction_id($transaction_id);
    $result = \WxPayApi::orderQuery($input);
    if(array_key_exists("return_code", $result)
        && array_key_exists("result_code", $result)
        && $result["return_code"] == "SUCCESS"
        && $result["result_code"] == "SUCCESS")
    {
        return true;
    }
    return false;
  }

 //array转xml
    public function toXML($values)
    {
    if(!is_array($values) || count($values) <= 0) {
        return "<xml></xml>";
    }//

    $xml = "<xml>";
    foreach ($values as $key => $val) {
        if (is_numeric($val)) {
            $xml.="<".$key.">".$val."</".$key.">";
        }else{
            $xml.="<".$key."><![CDATA[".$val."]]></".$key.">";
        }
    }//
    $xml.="</xml>";
    return $xml; 
    }
 
}
(2)、数据库处理代码


<?php
namespace app\index\model;
use think\Model;
class Deal extends Model
{
    public function add($datas) {
        $datas['pay_status'] = 0;
        $this->save($datas);
        return $this->id;

    }
     
    public function updatePay($outTradeNo, $weixindata) {
        if(!empty($weixindata['transaction_id'])) {
            $data['transaction_id'] = $weixindata['transaction_id'];
            $data['pay_status'] = 1;
        }
        return $this->allowField(true)
            ->save($data, ['trade_no' =>$outTradeNo]);
    }


}
7、thinkphp5 微信支付订单查询及支付成功后异步跳转

    (1)、微信支付订单查询及跳转前端代码

<!doctype html>
<html>
<head>
<meta charset="UTF-8">
<title>图像上传和处理示例</title>
<script src="//ajax.aspnetcdn.com/ajax/jQuery/jquery-1.8.3.min.js"></script>
</head>
<body>
 <div align="center"><h1 class="title">1使用微信扫码支付方式</h1><img alt="微信扫码支付" src="{$erweima}" style="width:300px;height:300px;"/>
{$ids}
  </div>
<script>
        function get_pay_status() {
            url = "{:url('index/paystatus')}";
            pay_success_url = "{:url('index/paysuccess')}";
            var id="{$ids}";
            postData = {
                'id' : id,
            };
            $.post(url, postData,function(result){
                //todo
                if(result.status==1) {
                    self.location=pay_success_url;
                }
            }, 'JSON');
        }
        window.setInterval("get_pay_status()", 2000);
    </script>
</body>
</html>
(2)、异步跳转处理

    

public function payStatus() {
        $id = input('post.id', 0, 'intval');
        if(!$id) {
            return 'id错误';
        }

        //判定是否登录
        $order =model("Deal")->get($id);

        if($order->pay_status == 1) { // 支付成功
            return show(1, 'success');
        }
        return show(0, 'error');
    }
     public function paysuccess()
    {

        return $this->fetch();
        
    }


AD:阿里云2000元代金券九折优惠点我领取 ¥2000元大礼包

AD:腾讯云2860元无门槛代金券,限时领取点我领取 ¥2860无门槛代金券