0

0

2016封装的微信支付,太好用了

php中文网

php中文网

发布时间:2016-08-04 08:56:20

|

1650人浏览过

|

来源于php中文网

原创

一直在做微信,遇到过很多坑,今天写出来,让大家少走点弯路,第一次写文字,有点土,如果有不懂的童鞋,可以联系我QQ1034100429,或者发私信。
getaccesstoken 获取access_token
//发起支付
public function sendpay($openid, $title, $out_trade_no, $total_fee, $notify_url)

sendtpl 发送模板消息 /**
 * Created by PhpStorm.
 * User: Administrator
 * Date: 2016/4/11
 * Time: 22:43
 */
namespace Org;
class Weixin
{
    private $appid;  //微信公众号的appid
    private $appsecret; //微信公众号的appsecret
    private $mchid;  //微信公众号的商户号
    private $wechatkey; //微信公众号的支付密钥
    private $token;
    public function __construct()
    {
        $this->appid = C('WEIXIN_APPID');
        $this->appsecret = C("WEIXIN_APP_SECRET");
        $this->mchid = C("WEIXIN_MCHID");
        $this->wechatkey = C("WEIXIN_KEY");
        $this->token = C('WEIXIN_APP_TOKEN');

    }
    public function chushi()
    {
        echo  $this->getaccesstoken();
    }
    public function checkSignature()
    {
        $signature = $_GET['signature'];
        $timestamp = $_GET['timestamp'];
        $nonce = $_GET['nonce'];
        $token = $this->token;
        $arrtemp = array($token, $timestamp, $nonce);
        sort($arrtemp, SORT_STRING);
        $arrtemp = implode($arrtemp);
        $arrtemp = sha1($arrtemp);
        if ($arrtemp == $signature) {
            return true;
        } else {
            return false;
        }
    }
    public function valid()
    {
        $echoStr = $_GET['echostr'];
        if ($this->checkSignature()) {
            echo $echoStr;
            exit;
        }
    }
////根据返回的信息,做出相应的处理
//    public function responseMsg()
//    {
//        $postStr = file_get_contents('php://input');
//        if (!empty($postStr)){
//            /* libxml_disable_entity_loader is to prevent XML eXternal Entity Injection,
//               the best way is to check the validity of xml by yourself */
//            libxml_disable_entity_loader(true);
//            $postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA);
//            $fromUsername = $postObj->FromUserName;
//            $toUsername = $postObj->ToUserName;
//            $keyword = trim($postObj->Content);
//            $msgType = $postObj->MsgType;
//            $Event=$postObj->Event;
//            $time = time();
//            $textTpl = "
//                            
//                            
//                            %s
//                            
//                            
//                            0
//                            
";
//            if(!empty( $keyword ))
//            {
//                $msgType = "text";
//                $contentStr = "Welcome to wechat world!";
//                $resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType, $contentStr);
//                echo $resultStr;
//            }else{
//                echo "Input something...";
//            }
//
//        }else {
//            echo "";
//            exit;
//        }
//    }
    public function getaccesstoken()
    {
        $access_token = S('access_token');
        if(!empty($access_token)){

            return $access_token;
        }else{
            $url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=" . $this->appid . "&secret=" . $this->appsecret;;
            $ret = $this->curlget($url);
            $ret = json_decode($ret,true);
            S('access_token',$ret['access_token'],7100);
    
            return $ret['access_token'];
        }
    }
    //根据openid拉取用户信息
    public  function userinfo($openid){
        $access_token = $this->getaccesstoken();
        $url = "https://api.weixin.qq.com/cgi-bin/user/info?access_token=".$access_token."&openid=".$openid."&lang=zh_CN";
        $userinfo = json_decode($this->curlget($url),true);
        return $userinfo;
    }
    function p($arr){
        echo "

";
        print_r($arr);
    }
    function curlget($url)
    {
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
        curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt($ch, CURLOPT_HEADER, 0);
        $output = curl_exec($ch);
        curl_close($ch);
        return $output;
    }
    public function jingmo($url,$code,$state){
        if($code){
            $url = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=".$this->appid."&secret=".$this->appsecret."&code=".$code."&grant_type=authorization_code";
            $arrtemp = json_decode($this->curlget($url),true);
            $ret = $this->getuserinfo($arrtemp['openid'],$arrtemp['access_token']);
            return  $ret;
        }else{
            $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";
            header("Location: $url");
        }
    }
    public function getuserinfo($openid,$user_access_token){
        $userurl = "https://api.weixin.qq.com/sns/userinfo?access_token=".$user_access_token."&openid=".$openid."&lang=zh_CN";
        $userinfo = json_decode($this->curlget($userurl),true);
        return $userinfo;
    }
    public function getjsapi_ticket(){
        $js_ticket = S("js_ticket");
        if(!empty($js_ticket)){
            return $js_ticket;
        }else{
            $access_token = $this->getaccesstoken();
            $url = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=".$access_token."&type=jsapi";
            $res = json_decode($this->curlget($url),true);
            S("js_ticket",$res['ticket'],7100);
            return $res['ticket'];
        }
    }
    public function getjssign(){
        echo "";
        $js_ticket = $this->getjsapi_ticket();
        $time = time();
        $arr = array(
            'noncestr'=>md5($time),
            'jsapi_ticket'=>$js_ticket,
            'timestamp'=>$time,
            'url'=>'http://'.$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'],

        );
        $this->p($arr);
        ksort($arr);
        $string="";
        $i=1;
        foreach($arr as $key=>$val){
            if($i==1){
                $string.=$key."=".$val;
            }else{
                $string.="&".$key."=".$val;
            }
            $i++;
            echo $i;
        }
        // echo $string;
        $signature =strtolower($string);
        $signature =  sha1($string);
        $jsconfig = array(
            'debug'=>true,
            'appId'=>$this->appid,
            'timestamp'=>$time,
            'nonceStr'=>md5($time),
            'signature'=>$signature,
            ' jsApiList'=>"['onMenuShareTimeline','onMenuShareAppMessage','onMenuShareQQ']",
        );
        $json = json_encode($jsconfig);
        return $json;
    }
    //生成大写签名
    function createsign($arr,$biaozhi){
        ksort($arr);
        $string="";
        $i=1;
        foreach($arr as $key=>$val){
            if($i==1){
                $string.=$key."=".$val;
            }else{
                $string.="&".$key."=".$val;
            }
            $i++;
        }
        $signtemp = "$string&key=" . $this->wechatkey;
        $sign = strtoupper(MD5($signtemp));
        $arr[$biaozhi] = $sign;
        //$json = json_encode($arr);
        return $arr;
    }
    //支付

    //发起支付
    public function sendpay($openid, $title, $out_trade_no, $total_fee, $notify_url)
    {
        $time = time();
        $arr = array(
            'appid' => $this->appid,
            'mch_id' => $this->mchid,
            'nonce_str' => md5($time),
            'body' => "kjhk",
            'out_trade_no' => $out_trade_no,
            'total_fee' => $total_fee,
            'spbill_create_ip' => "127.0.0.1",
            'notify_url' => $notify_url,
            'trade_type' => "JSAPI",
            'openid' => $openid,
        );
        $biaozhi ='sign';
        $arr = $this->createsign($arr,$biaozhi);
        $xml = "";
        foreach ($arr as $key=>$val) {
            $xml.="".$val."".$key.">";
        }
        $xml.="
";
        $url = "https://api.mch.weixin.qq.com/pay/unifiedorder";
        $resxml =  $this->postCurlTransfer($url,$xml);
        $res = simplexml_load_string($resxml);
        $cutime = time();
        $jsapiarr=array(
            'appId'=>$this->appid,
            'timeStamp'=>"$cutime",
            'nonceStr'=>md5($cutime),
            'package'=>"prepay_id=".$res->prepay_id,
            'signType'=>"MD5",
        );
        $biaozhi = 'paySign';
        $jsapi = $this->createsign($jsapiarr,$biaozhi);
       // $jsapijson = json_encode($jsapi);
        return $jsapi;
    }
    public function getpaysign(){
        $time = time();
        $arr = array(
            'appid'=>$this->appid,
            'mch_id'=>$this->mchid,
            'nonce_str'=>md5($time),
            'body'=>"sdf",
            'out_trade_no'=>"2016".$time,
            'total_fee'=>1,
            'spbill_create_ip'=>"127.0.0.1",
            'notify_url'=>"http://www.baidu.com",
            'trade_type'=>"JSAPI",
        );
        ksort($arr);
        $string="";
        $i=1;
        foreach($arr as $key=>$val){
            if($i==1){
                $string.=$key."=".$val;
            }else{
                $string.="&".$key."=".$val;
            }
            $i++;
        }
        $string.="&key=".$this->wechatkey;
        $sign = strtoupper(md5($string));
        $arr['sign'] = $sign;
        return $arr;
    }
    function Post($curlPost,$url){
        $curl = curl_init();
        curl_setopt($curl, CURLOPT_URL, $url);
        curl_setopt($curl, CURLOPT_HEADER, false);
        curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($curl, CURLOPT_NOBODY, true);
        curl_setopt($curl, CURLOPT_POST, true);
        curl_setopt($curl, CURLOPT_POSTFIELDS, $curlPost);
        $return_str = curl_exec($curl);
        curl_close($curl);
        return $return_str;
    }
    private function postCurlTransfer($url, $data)
    {
        $curl = curl_init();
        curl_setopt($curl, CURLOPT_URL, $url);
        curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt($curl, CURLOPT_POST, 1);
        curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
        $str = curl_exec($curl);
        curl_close($curl);

        return $str;
    }
    //发送模板消息
    public function sendtpl($openid, $url, $template_id, $content, $topcolor="#FF0000")
    {
        $arr = array(
            'touser' => $openid,
            'template_id' => $template_id,
            'url' => $url,
            'topcolor' => $topcolor,
            'data' => $content,
        );
        $arrjson = json_encode($arr);
        $accesstoken = $this->getAccessToken();
        $sendurl = "https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=".$accesstoken;
        return $this->postCurlTransfer($sendurl, $arrjson);
    }
}
上面的是微信支付简单封装

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

获取access_token的过程 /**
 * Created by PhpStorm.
 * User: sks
 * Date: 16/7/8
 * Time: 下午3:54
 */
namespace Home\Controller;
use Common\Controller\HomebaseController;
Class WeixinController extends HomebaseController{
    public function zhanshi(){
        $weixin = new \Org\Weixin;
        $code = $_GET['code'];
        $state = $_GET['state'];
        $url="";
        $userinfo = $weixin->jingmo($url, $code, $state);
        session('userinfo',$userinfo);
        if($code) {
            header("Location: $state");
        }else{
        }
    }
}
公共函数
function.phpfunction getuserinfo(){   //获取用户信息
    import("weixin");
    $weixin = new \Org\Weixin;
    $info = session('userinfo');
    if($info){
        return $info;
        die;
    }else {
        $state = 'http://' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];
        $code = '';
        $url = 'http://' . $_SERVER['HTTP_HOST'] . U('Home/Weixin/zhanshi');
        $url = urlencode($url);
        $weixin->jingmo($url, $code, $state);
    }
}
测试支付 /**
 * Created by PhpStorm.
 * User: sks
 * Date: 16/7/8
 * Time: 下午3:29
 */
namespace Home\Controller;
use Common\Controller\HomebaseController;
use Think\Page;
Class IndexController extends HomebaseController{

    //测试支付
    public function zhifu()
    {
        $userinfo =  getuserinfo(); //获取微信用户信息调用公共函数
        $openid = $userinfo['openid'];
        $time = time();
        $title = "我要支付";
        $out_trade_no = date('Y',time()).$time.rand(1000,2000);
        $total_fee = 1;
        $notify_url = "http://域名/index.php/Home/Index/paynotify";//回调网址
        $weixin = new \Org\Weixin;
        $result = $weixin->sendpay($openid, $title, $out_trade_no, $total_fee, $notify_url);
        $this->assign('result',$result);
        $this->display();
    }
//这里是支付结果通知
    public function paynotify(){
        $weixin = new \Org\Weixin;
        $xml = file_get_contents("php://input");
        $p = simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOCDATA);
        $arr = $this->object_array($p);
        $out_trade_no = $arr['out_trade_no'];
        $transaction_id= $arr['transaction_id'];
        $openid = $arr['openid'];
        $sign = $arr['sign'];
        //处理支付结果
        unset($arr['sign']);
        $biaozhi = "sign";
        $ret = $weixin->createsign($arr, $biaozhi);
        if($ret['sign'] === $sign) {
            $aa = "成功";
        } else {
            $aa = "失败";
        }
        $file  = './logweixin.txt';//要写入文件的文件名(可以是任意文件名),如果文件不存在,将会创建一个
        $content = $out_trade_no."***".$transaction_id."第一次写入的内容\n";
        if($f  = file_put_contents($file, $content,FILE_APPEND)){// 这个函数支持版本(PHP 5)
                      echo "写入成功。
";
          }
    //这里处理支付结果的过程
        echo "success";
    }

    public function getaccesstoken(){
        $weixin = new \Org\Weixin;
        echo $weixin->getaccesstoken();

    }
}

微信app下载
微信app下载

微信是一款手机通信软件,支持通过手机网络发送语音短信、视频、图片和文字。微信可以单聊及群聊,还能根据地理位置找到附近的人,带给大家全新的移动沟通体验,有需要的小伙伴快来保存下载体验吧!

下载

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
Python 自然语言处理(NLP)基础与实战
Python 自然语言处理(NLP)基础与实战

本专题系统讲解 Python 在自然语言处理(NLP)领域的基础方法与实战应用,涵盖文本预处理(分词、去停用词)、词性标注、命名实体识别、关键词提取、情感分析,以及常用 NLP 库(NLTK、spaCy)的核心用法。通过真实文本案例,帮助学习者掌握 使用 Python 进行文本分析与语言数据处理的完整流程,适用于内容分析、舆情监测与智能文本应用场景。

10

2026.01.27

拼多多赚钱的5种方法 拼多多赚钱的5种方法
拼多多赚钱的5种方法 拼多多赚钱的5种方法

在拼多多上赚钱主要可以通过无货源模式一件代发、精细化运营特色店铺、参与官方高流量活动、利用拼团机制社交裂变,以及成为多多进宝推广员这5种方法实现。核心策略在于通过低成本、高效率的供应链管理与营销,利用平台社交电商红利实现盈利。

109

2026.01.26

edge浏览器怎样设置主页 edge浏览器自定义设置教程
edge浏览器怎样设置主页 edge浏览器自定义设置教程

在Edge浏览器中设置主页,请依次点击右上角“...”图标 > 设置 > 开始、主页和新建标签页。在“Microsoft Edge 启动时”选择“打开以下页面”,点击“添加新页面”并输入网址。若要使用主页按钮,需在“外观”设置中开启“显示主页按钮”并设定网址。

16

2026.01.26

苹果官方查询网站 苹果手机正品激活查询入口
苹果官方查询网站 苹果手机正品激活查询入口

苹果官方查询网站主要通过 checkcoverage.apple.com/cn/zh/ 进行,可用于查询序列号(SN)对应的保修状态、激活日期及技术支持服务。此外,查找丢失设备请使用 iCloud.com/find,购买信息与物流可访问 Apple (中国大陆) 订单状态页面。

136

2026.01.26

npd人格什么意思 npd人格有什么特征
npd人格什么意思 npd人格有什么特征

NPD(Narcissistic Personality Disorder)即自恋型人格障碍,是一种心理健康问题,特点是极度夸大自我重要性、需要过度赞美与关注,同时极度缺乏共情能力,背后常掩藏着低自尊和不安全感,影响人际关系、工作和生活,通常在青少年时期开始显现,需由专业人士诊断。

7

2026.01.26

windows安全中心怎么关闭 windows安全中心怎么执行操作
windows安全中心怎么关闭 windows安全中心怎么执行操作

关闭Windows安全中心(Windows Defender)可通过系统设置暂时关闭,或使用组策略/注册表永久关闭。最简单的方法是:进入设置 > 隐私和安全性 > Windows安全中心 > 病毒和威胁防护 > 管理设置,将实时保护等选项关闭。

6

2026.01.26

2026年春运抢票攻略大全 春运抢票攻略教你三招手【技巧】
2026年春运抢票攻略大全 春运抢票攻略教你三招手【技巧】

铁路12306提供起售时间查询、起售提醒、购票预填、候补购票及误购限时免费退票五项服务,并强调官方渠道唯一性与信息安全。

122

2026.01.26

个人所得税税率表2026 个人所得税率最新税率表
个人所得税税率表2026 个人所得税率最新税率表

以工资薪金所得为例,应纳税额 = 应纳税所得额 × 税率 - 速算扣除数。应纳税所得额 = 月度收入 - 5000 元 - 专项扣除 - 专项附加扣除 - 依法确定的其他扣除。假设某员工月工资 10000 元,专项扣除 1000 元,专项附加扣除 2000 元,当月应纳税所得额为 10000 - 5000 - 1000 - 2000 = 2000 元,对应税率为 3%,速算扣除数为 0,则当月应纳税额为 2000×3% = 60 元。

35

2026.01.26

oppo云服务官网登录入口 oppo云服务登录手机版
oppo云服务官网登录入口 oppo云服务登录手机版

oppo云服务https://cloud.oppo.com/可以在云端安全存储您的照片、视频、联系人、便签等重要数据。当您的手机数据意外丢失或者需要更换手机时,可以随时将这些存储在云端的数据快速恢复到手机中。

121

2026.01.26

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Git 教程
Git 教程

共21课时 | 3万人学习

Kotlin 教程
Kotlin 教程

共23课时 | 2.9万人学习

PHP新手语法线上课程教学
PHP新手语法线上课程教学

共13课时 | 0.9万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号