ThinkPHP5.1框架实现微信扫码支付

简介ThinkPHP5.1框架实现微信扫码支付
  1. 控制器

<?php
namespace app\index\controller;
class Index
{
   const APPID = 'wxasfafkafef65c'; //微信商户绑定的公众号appid
   const SECRET = '137a1a086895de6b02fce43462156330';//公众号密钥
   const MCHID = '1584979631'; //商户号
   const KEY = 'xxxxxxxxxxxxxxxxxxxxxxxxx'; //商户支付秘钥
   const NOTIFY_URL = 'http://tp51.beambitious.cn/index/index/NativePayNotify';//接收微信支付结果通知的回调地址

   //微信支付结果回调
   public function NativePayNotify(){
//        $wxData = file_get_contents("php://input");
//        file_put_contents('temp/2.txt',$wxData,FILE_APPEND);//写文件
//        $arrData = $this->XmlToArr($wxData);
//        if($arrData['return_code'] == 'FAIL' || $arrData['result_code'] !== 'SUCCESS'){
//            $arrData['return_code'] = 'FAIL';
//            $arrData['return_msg'] = 'ERROR';
//            return $this->ArrToXml($arrData);
//        }
//        $outTradNo = $arrData['out_trade_no'];
//        $order = model('Order')->get(['out_trade_no'=>$outTradNo]);
//        if(!$order || $order->pay_status == 1){ //如果订单不存在 或者订单已支付 ,告诉微信不用再通知了
//            $arrData['return_code'] = 'SUCCESS';
//            $arrData['return_msg'] = 'OK';
//            return $this->ArrToXml($arrData);
//        }
//        //更新订单表数据
//        try{
//            $orderRes = model('Order')->updateOrderByOutTradeNo($outTradNo,$arrData);
//            model('Deal')->updateBuyCountById($order->deal_id,$order->deal_count);
//        }catch (\Exception $e){
//            return false;
//        }
//        $arrData['return_code'] = 'SUCCESS';
//        $arrData['return_msg'] = 'OK';
//        return $this->ArrToXml($arrData);

   }

   //微信扫码支付
   public function NativePay(){
       $order_id = 1236;//订单id
       $params = [
           'appid' => self::APPID,
           'mch_id' => self::MCHID,
           'nonce_str' => md5(time()),//随机字符串
           'body' => "测试商品",
           'out_trade_no' => 123456789123, //订单编号
           'total_fee' => 1,//商品价格
           'spbill_create_ip'=> $_SERVER['SERVER_ADDR'],
           'notify_url' => self::NOTIFY_URL,
           'trade_type' => 'NATIVE',//支付方式:扫码支付
           'product_id' => 1 //商品id
       ];
       $params['sign'] = $this->getSign($params);
       //数组转 xml
       $xml = $this->ArrToXml($params);
       //发送数据到微信统一下单 API 地址
       $data = $this->httpRequest('https://api.mch.weixin.qq.com/pay/unifiedorder', $xml);
       $arr = $this->XmlToArr($data);
       // var_dump($arr);exit;
       //判断结果
       if($arr['result_code'] == 'SUCCESS' && $arr['return_code'] == 'SUCCESS')
       {
           $url = $arr['code_url'];//二维码url
       }else{
           $url = "";
       }
       return view('pay/index',['url'=>$url,'order_id'=>$order_id]);


   }

   //获取签名
   public function getSign($params)
   {
       //0.移除 sign
       if (isset($params['sign'])) unset($params['sign']);
       //1.参数名 ASCII 码从小到大排序(字典序)
       ksort($params);
       //2.组装字符串,键值对形式 & md5 加密 & 转化为大写
       $str = http_build_query($params) . '&key=' . self::KEY;
       $str = strtoupper(md5(urldecode($str)));
       //3.返回签名
       return $str;
   }
   //发起请求
   public  function httpRequest($api, $postData)
   {
       //1.初始化
       $ch = curl_init();
       //2.配置
       //2.1 设置请求地址
       curl_setopt($ch, CURLOPT_URL, $api);
       //2.2 数据流不直接输出
       curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
       //2.3POST 请求
       if ($postData) {

           curl_setopt($ch, CURLOPT_POST, true);
           curl_setopt($ch, CURLOPT_POSTFIELDS, $postData);
       }
       //curl 注意事项,如果发送的请求是 https,必须要禁止服务器端校检 SSL 证书
       curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
       curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
       //3.发送请求
       $data = curl_exec($ch);
       //4.释放资源
       curl_close($ch);
       return $data;
   }
   /**
    * XML 文档转化为数组
    */
   public  function XmlToArr($xml)
   {
       if ($xml == '') return '';
       libxml_disable_entity_loader(true);
       $arr = json_decode(json_encode(simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOCDATA)), true);
       return $arr;
   }
   /**
    * 将数组转化为 XML 文档
    */
   public  function ArrToXml($arr)
   {
       if(!is_array($arr) || count($arr) == 0) return '';
       $xml = ";
       foreach ($arr as $key=>$val)
       {
           if (is_numeric($val)){
               $xml.="<".$key.">".$val.".$key.">";
           }else{
               $xml.="<".$key.">


2.视图文件

b733f509451d9f9073e5595c93dfaaf.png


3.浏览器输入地址:http://tp51.beambitious.cn/index/index/NativePay。 即可看到微信支付二维码

image.png

 

文章评论

共有0条评论来说两句吧...

用户名:

验证码:

Top