PHP群:95885625 Hbuilder+MUI群:81989597 站长QQ:634381967
    您现在的位置: 首页 > 开发编程 > ThinkPhp教程 > 正文

    thinkphp封装好的微信支付

    作者:admin来源:网络浏览:时间:2020-09-30 00:07:50我要评论
    导读:thinkphp封装好的微信支付
    一直在做微信,遇到过很多坑,今天写出来,让大家少走点弯路。
    getaccesstoken 获取access_token
    //发起支付
    public function sendpay($openid, $title, $out_trade_no, $total_fee, $notify_url)

    sendtpl 发送模板消息

    1. <?php 
    2.  /**
    3.  * Created by PhpStorm.
    4.  * User: Administrator
    5.  * Date: 2016/4/11
    6.  * Time: 22:43
    7.  */
    8.  namespace Org; 
    9.  class Weixin 
    10.  { 
    11.     private $appid;  //微信公众号的appid
    12.     private $appsecret//微信公众号的appsecret
    13.     private $mchid;  //微信公众号的商户号
    14.     private $wechatkey//微信公众号的支付密钥
    15.     private $token
    16.     public function __construct() 
    17.     { 
    18.         $this->appid = C('WEIXIN_APPID'); 
    19.         $this->appsecret = C("WEIXIN_APP_SECRET"); 
    20.         $this->mchid = C("WEIXIN_MCHID"); 
    21.         $this->wechatkey = C("WEIXIN_KEY"); 
    22.         $this->token = C('WEIXIN_APP_TOKEN'); 
    23.     } 
    24.     public function chushi() 
    25.     { 
    26.         echo  $this->getaccesstoken(); 
    27.     } 
    28.     public function checkSignature() 
    29.     { 
    30.         $signature = $_GET['signature']; 
    31.         $timestamp = $_GET['timestamp']; 
    32.         $nonce = $_GET['nonce']; 
    33.         $token = $this->token; 
    34.         $arrtemp = array($token$timestamp$nonce); 
    35.         sort($arrtemp, SORT_STRING); 
    36.         $arrtemp = implode($arrtemp); 
    37.         $arrtemp = sha1($arrtemp); 
    38.         if ($arrtemp == $signature) { 
    39.             return true; 
    40.         } else { 
    41.             return false; 
    42.         } 
    43.     } 
    44.     public function valid() 
    45.     { 
    46.         $echoStr = $_GET['echostr']; 
    47.         if ($this->checkSignature()) { 
    48.             echo $echoStr
    49.             exit
    50.         } 
    51.     } 
    52.  ////根据返回的信息,做出相应的处理
    53.  //    public function responseMsg()
    54.  //    {
    55.  //        $postStr = file_get_contents('php://input');
    56.  //        if (!empty($postStr)){
    57.  //            /* libxml_disable_entity_loader is to prevent XML eXternal Entity Injection,
    58.  //               the best way is to check the validity of xml by yourself */
    59.  //            libxml_disable_entity_loader(true);
    60.  //            $postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA);
    61.  //            $fromUsername = $postObj->FromUserName;
    62.  //            $toUsername = $postObj->ToUserName;
    63.  //            $keyword = trim($postObj->Content);
    64.  //            $msgType = $postObj->MsgType;
    65.  //            $Event=$postObj->Event;
    66.  //            $time = time();
    67.  //            $textTpl = "<xml>
    68.  //                            <ToUserName><![CDATA[%s]]></ToUserName>
    69.  //                            <FromUserName><![CDATA[%s]]></FromUserName>
    70.  //                            <CreateTime>%s</CreateTime>
    71.  //                            <MsgType><![CDATA[%s]]></MsgType>
    72.  //                            <Content><![CDATA[%s]]></Content>
    73.  //                            <FuncFlag>0</FuncFlag>
    74.  //                            </xml>";
    75.  //            if(!empty( $keyword ))
    76.  //            {
    77.  //                $msgType = "text";
    78.  //                $contentStr = "Welcome to wechat world!";
    79.  //                $resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType, $contentStr);
    80.  //                echo $resultStr;
    81.  //            }else{
    82.  //                echo "Input something...";
    83.  //            }
    84.  //
    85.  //        }else {
    86.  //            echo "";
    87.  //            exit;
    88.  //        }
    89.  //    }
    90.     public function getaccesstoken() 
    91.     { 
    92.         $access_token = S('access_token'); 
    93.         if(!emptyempty($access_token)){ 
    94.             return $access_token
    95.         }else
    96.             $url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=" . $this->appid . "&secret=" . $this->appsecret;; 
    97.             $ret = $this->curlget($url); 
    98.             $ret = json_decode($ret,true); 
    99.             S('access_token',$ret['access_token'],7100); 
    100.      
    101.             return $ret['access_token']; 
    102.         } 
    103.     } 
    104.     //根据openid拉取用户信息
    105.     public  function userinfo($openid){ 
    106.         $access_token = $this->getaccesstoken(); 
    107.         $url = "https://api.weixin.qq.com/cgi-bin/user/info?access_token=".$access_token."&openid=".$openid."&lang=zh_CN"
    108.         $userinfo = json_decode($this->curlget($url),true); 
    109.         return $userinfo
    110.     } 
    111.     function p($arr){ 
    112.         echo "<meta charset='utf8'><pre>"
    113.         print_r($arr); 
    114.     } 
    115.     function curlget($url
    116.     { 
    117.         $ch = curl_init(); 
    118.         curl_setopt($ch, CURLOPT_URL, $url); 
    119.         curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE); 
    120.         curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE); 
    121.         curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
    122.         curl_setopt($ch, CURLOPT_HEADER, 0); 
    123.         $output = curl_exec($ch); 
    124.         curl_close($ch); 
    125.         return $output
    126.     } 
    127.     public function jingmo($url,$code,$state){ 
    128.         if($code){ 
    129.             $url = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=".$this->appid."&secret=".$this->appsecret."&code=".$code."&grant_type=authorization_code"
    130.             $arrtemp = json_decode($this->curlget($url),true); 
    131.             $ret = $this->getuserinfo($arrtemp['openid'],$arrtemp['access_token']); 
    132.             return  $ret
    133.         }else
    134.             $url = "https://open.weixin.qq.com/connect/oauth2/authorize?appid=".$this->appid."&redirect_uri=".$url."&response_type=code&scope=snsapi_userinfo&state=".$state."#wechat_redirect"
    135.             header("Location: $url"); 
    136.         } 
    137.     } 
    138.     public function getuserinfo($openid,$user_access_token){ 
    139.         $userurl = "https://api.weixin.qq.com/sns/userinfo?access_token=".$user_access_token."&openid=".$openid."&lang=zh_CN"
    140.         $userinfo = json_decode($this->curlget($userurl),true); 
    141.         return $userinfo
    142.     } 
    143.     public function getjsapi_ticket(){ 
    144.         $js_ticket = S("js_ticket"); 
    145.         if(!emptyempty($js_ticket)){ 
    146.             return $js_ticket
    147.         }else
    148.             $access_token = $this->getaccesstoken(); 
    149.             $url = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=".$access_token."&type=jsapi"
    150.             $res = json_decode($this->curlget($url),true); 
    151.             S("js_ticket",$res['ticket'],7100); 
    152.             return $res['ticket']; 
    153.         } 
    154.     } 
    155.     public function getjssign(){ 
    156.         echo "<meta charset='utf8'>"
    157.         $js_ticket = $this->getjsapi_ticket(); 
    158.         $time = time(); 
    159.         $arr = array
    160.             'noncestr'=>md5($time), 
    161.             'jsapi_ticket'=>$js_ticket
    162.             'timestamp'=>$time
    163.             'url'=>'http://'.$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'], 
    164.         ); 
    165.         $this->p($arr); 
    166.         ksort($arr); 
    167.         $string=""
    168.         $i=1; 
    169.         foreach($arr as $key=>$val){ 
    170.             if($i==1){ 
    171.                 $string.=$key."=".$val
    172.             }else
    173.                 $string.="&".$key."=".$val
    174.             } 
    175.             $i++; 
    176.             echo $i
    177.         } 
    178.         // echo $string;
    179.         $signature =strtolower($string); 
    180.         $signature =  sha1($string); 
    181.         $jsconfig = array
    182.             'debug'=>true, 
    183.             'appId'=>$this->appid, 
    184.             'timestamp'=>$time
    185.             'nonceStr'=>md5($time), 
    186.             'signature'=>$signature
    187.             ' jsApiList'=>"['onMenuShareTimeline','onMenuShareAppMessage','onMenuShareQQ']"
    188.         ); 
    189.         $json = json_encode($jsconfig); 
    190.         return $json
    191.     } 
    192.     //生成大写签名
    193.     function createsign($arr,$biaozhi){ 
    194.         ksort($arr); 
    195.         $string=""
    196.         $i=1; 
    197.         foreach($arr as $key=>$val){ 
    198.             if($i==1){ 
    199.                 $string.=$key."=".$val
    200.             }else
    201.                 $string.="&".$key."=".$val
    202.             } 
    203.             $i++; 
    204.         } 
    205.         $signtemp = "$string&key=" . $this->wechatkey; 
    206.         $sign = strtoupper(MD5($signtemp)); 
    207.         $arr[$biaozhi] = $sign
    208.         //$json = json_encode($arr);
    209.         return $arr
    210.     } 
    211.     //支付
    212.     //发起支付
    213.     public function sendpay($openid$title$out_trade_no$total_fee$notify_url
    214.     { 
    215.         $time = time(); 
    216.         $arr = array
    217.             'appid' => $this->appid, 
    218.             'mch_id' => $this->mchid, 
    219.             'nonce_str' => md5($time), 
    220.             'body' => "kjhk"
    221.             'out_trade_no' => $out_trade_no
    222.             'total_fee' => $total_fee
    223.             'spbill_create_ip' => "127.0.0.1"
    224.             'notify_url' => $notify_url
    225.             'trade_type' => "JSAPI"
    226.             'openid' => $openid
    227.         ); 
    228.         $biaozhi ='sign'
    229.         $arr = $this->createsign($arr,$biaozhi); 
    230.         $xml = "<xml>"
    231.         foreach ($arr as $key=>$val) { 
    232.             $xml.="<".$key.">".$val."</".$key.">"
    233.         } 
    234.         $xml.="</xml>"
    235.         $url = "https://api.mch.weixin.qq.com/pay/unifiedorder"
    236.         $resxml =  $this->postCurlTransfer($url,$xml); 
    237.         $res = simplexml_load_string($resxml); 
    238.         $cutime = time(); 
    239.         $jsapiarr=array
    240.             'appId'=>$this->appid, 
    241.             'timeStamp'=>"$cutime"
    242.             'nonceStr'=>md5($cutime), 
    243.             'package'=>"prepay_id=".$res->prepay_id, 
    244.             'signType'=>"MD5"
    245.         ); 
    246.         $biaozhi = 'paySign'
    247.         $jsapi = $this->createsign($jsapiarr,$biaozhi); 
    248.        // $jsapijson = json_encode($jsapi);
    249.         return $jsapi
    250.     } 
    251.     public function getpaysign(){ 
    252.         $time = time(); 
    253.         $arr = array
    254.             'appid'=>$this->appid, 
    255.             'mch_id'=>$this->mchid, 
    256.             'nonce_str'=>md5($time), 
    257.             'body'=>"sdf"
    258.             'out_trade_no'=>"2016".$time
    259.             'total_fee'=>1, 
    260.             'spbill_create_ip'=>"127.0.0.1"
    261.             'notify_url'=>"http://www.baidu.com"
    262.             'trade_type'=>"JSAPI"
    263.         ); 
    264.         ksort($arr); 
    265.         $string=""
    266.         $i=1; 
    267.         foreach($arr as $key=>$val){ 
    268.             if($i==1){ 
    269.                 $string.=$key."=".$val
    270.             }else
    271.                 $string.="&".$key."=".$val
    272.             } 
    273.             $i++; 
    274.         } 
    275.         $string.="&key=".$this->wechatkey; 
    276.         $sign = strtoupper(md5($string)); 
    277.         $arr['sign'] = $sign
    278.         return $arr
    279.     } 
    280.     function Post($curlPost,$url){ 
    281.         $curl = curl_init(); 
    282.         curl_setopt($curl, CURLOPT_URL, $url); 
    283.         curl_setopt($curl, CURLOPT_HEADER, false); 
    284.         curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); 
    285.         curl_setopt($curl, CURLOPT_NOBODY, true); 
    286.         curl_setopt($curl, CURLOPT_POST, true); 
    287.         curl_setopt($curl, CURLOPT_POSTFIELDS, $curlPost); 
    288.         $return_str = curl_exec($curl); 
    289.         curl_close($curl); 
    290.         return $return_str
    291.     } 
    292.     private function postCurlTransfer($url$data
    293.     { 
    294.         $curl = curl_init(); 
    295.         curl_setopt($curl, CURLOPT_URL, $url); 
    296.         curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); 
    297.         curl_setopt($curl, CURLOPT_POST, 1); 
    298.         curl_setopt($curl, CURLOPT_POSTFIELDS, $data); 
    299.         $str = curl_exec($curl); 
    300.         curl_close($curl); 
    301.         return $str
    302.     } 
    303.     //发送模板消息
    304.     public function sendtpl($openid$url$template_id$content$topcolor="#FF0000"
    305.     { 
    306.         $arr = array
    307.             'touser' => $openid
    308.             'template_id' => $template_id
    309.             'url' => $url
    310.             'topcolor' => $topcolor
    311.             'data' => $content
    312.         ); 
    313.         $arrjson = json_encode($arr); 
    314.         $accesstoken = $this->getAccessToken(); 
    315.         $sendurl = "https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=".$accesstoken
    316.         return $this->postCurlTransfer($sendurl$arrjson); 
    317.     } 
    318.  } 

    上面的是微信支付简单封装

    如果发起支付,请先对应好微信公众号的资料。
    包括微信支付目录
    我这里是
    http://域名//index.php/Home/Index/
    好像是这个

    获取access_token的过程

     

    1. <?php 
    2. /**
    3.  * Created by PhpStorm.
    4.  * User: sks
    5.  * Date: 16/7/8
    6.  * Time: 下午3:54
    7.  */
    8. namespace Home\Controller; 
    9. use Common\Controller\HomebaseController; 
    10. Class WeixinController extends HomebaseController{ 
    11.     public function zhanshi(){ 
    12.         $weixin = new \Org\Weixin; 
    13.         $code = $_GET['code']; 
    14.         $state = $_GET['state']; 
    15.         $url=""
    16.         $userinfo = $weixin->jingmo($url$code$state); 
    17.         session('userinfo',$userinfo); 
    18.         if($code) { 
    19.             header("Location: $state"); 
    20.         }else
    21.         } 
    22.     } 

    公共函数
    function.php

     

    1. function getuserinfo(){   //获取用户信息
    2.     import("weixin"); 
    3.     $weixin = new \Org\Weixin; 
    4.     $info = session('userinfo'); 
    5.     if($info){ 
    6.         return $info
    7.         die
    8.     }else { 
    9.         $state = 'http://' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI']; 
    10.         $code = ''
    11.         $url = 'http://' . $_SERVER['HTTP_HOST'] . U('Home/Weixin/zhanshi'); 
    12.         $url = urlencode($url); 
    13.         $weixin->jingmo($url$code$state); 
    14.     } 

    测试支付

     

    1. <?php 
    2. /**
    3.  * Created by PhpStorm.
    4.  * User: sks
    5.  * Date: 16/7/8
    6.  * Time: 下午3:29
    7.  */
    8. namespace Home\Controller; 
    9. use Common\Controller\HomebaseController; 
    10. use Think\Page; 
    11. Class IndexController extends HomebaseController{ 
    12.  
    13.     //测试支付
    14.     public function zhifu() 
    15.     { 
    16.         $userinfo =  getuserinfo(); //获取微信用户信息调用公共函数
    17.         $openid = $userinfo['openid']; 
    18.         $time = time(); 
    19.         $title = "我要支付"
    20.         $out_trade_no = date('Y',time()).$time.rand(1000,2000); 
    21.         $total_fee = 1; 
    22.         $notify_url = "http://域名/index.php/Home/Index/paynotify";//回调网址 
    23.         $weixin = new \Org\Weixin; 
    24.         $result = $weixin->sendpay($openid$title$out_trade_no$total_fee$notify_url); 
    25.         $this->assign('result',$result); 
    26.         $this->display(); 
    27.     } 
    28. //这里是支付结果通知
    29.     public function paynotify(){ 
    30.         $weixin = new \Org\Weixin; 
    31.         $xml = file_get_contents("php://input"); 
    32.         $p = simplexml_load_string($xml'SimpleXMLElement', LIBXML_NOCDATA); 
    33.         $arr = $this->object_array($p); 
    34.         $out_trade_no = $arr['out_trade_no']; 
    35.         $transaction_id$arr['transaction_id']; 
    36.         $openid = $arr['openid']; 
    37.         $sign = $arr['sign']; 
    38.         //处理支付结果
    39.         unset($arr['sign']); 
    40.         $biaozhi = "sign"
    41.         $ret = $weixin->createsign($arr$biaozhi); 
    42.         if($ret['sign'] === $sign) { 
    43.             $aa = "成功"
    44.         } else { 
    45.             $aa = "失败"
    46.         } 
    47.         $file  = './logweixin.txt';//要写入文件的文件名(可以是任意文件名),如果文件不存在,将会创建一个
    48.         $content = $out_trade_no."***".$transaction_id."第一次写入的内容\n"
    49.         if($f  = file_put_contents($file$content,FILE_APPEND)){// 这个函数支持版本(PHP 5)
    50.                       echo "写入成功。<br />"
    51.           } 
    52.     //这里处理支付结果的过程
    53.         echo "success"
    54.     } 
    55.  
    56.     public function getaccesstoken(){ 
    57.         $weixin = new \Org\Weixin; 
    58.         echo $weixin->getaccesstoken(); 
    59.  
    60.     } 
    61.  
    转载请注明(B5教程网)原文链接:https://b5.mxunkeji.com/content-83-4994-1.html
    相关热词搜索: thinkphp 微信支付