php微信各接口集成程序(包括支付)

 
使用前需先打开微信帐号的开发模式,详细步骤请查看微信公众平台接口使用说明:
http://mp.weixin.qq.com/wiki/
 
微信支付接入文档: https://mp.weixin.qq.com/cgi-bin/readtemplate?t=business/course2_tmpl&lang=zh_CN
 
wechat.class.php
调用官方API,具有更灵活的消息分类响应方式,支持链式调用操作 ;
主要功能
 
接入验证 (初级权限)
自动回复(文本、图片、语音、视频、音乐、图文)(初级权限)
菜单操作(查询、创建、删除)(菜单权限)
客服消息(文本、图片、语音、视频、音乐、图文)(认证权限)
二维码(创建临时、永久二维码,获取二维码URL)(认证权限)
分组操作(查询、创建、修改、移动用户到分组)(认证权限)
网页授权(基本授权,用户信息授权)(认证权限)
用户信息(查询用户基本信息、获取关注者列表)(认证权限)
媒体文件(上传、获取)(认证权限)
调用地址组件 (支付权限)
生成订单签名数据 (支付权限)
订单成功回调 (支付权限)
发货通知 (支付权限)
支付订单查询 (支付权限)
初始化动作
 
$options = array(
    'token'=>'tokenaccesskey', //填写你设定的key
    'appid'=>'wxdk1234567890', //填写高级调用功能的app id, 请在微信开发模式后台查询
    'appsecret'=>'xxxxxxxxxxxxxxxxxxx', //填写高级调用功能的密钥
    'partnerid'=>'88888888', //财付通商户身份标识,支付权限专用,没有可不填
    'partnerkey'=>'', //财付通商户权限密钥Key,支付权限专用
    'paysignkey'=>'' //商户签名密钥Key,支付权限专用
    );
$weObj = new Wechat($options); //创建实例对象
//TODO:调用$weObj各实例方法
 
新增Auth高级权限类方法:
 
checkAuth($appid,$appsecret) 此处传入公众后台高级接口提供的appid和appsecret, 函数将返回access_token操作令牌
createMenu($data) 创建菜单 $data菜单结构详见 http://mp.weixin.qq.com/wiki/index.php?title=%E8%87%AA%E5%AE%9A%E4%B9%89%E8%8F%9C%E5%8D%95%E5%88%9B%E5%BB%BA%E6%8E%A5%E5%8F%A3
getMenu() 获取菜单
deleteMenu() 删除菜单
getMedia() 获取接收到的音频、视频媒体文件
getQRCode($scene_id,$type=0,$expire=1800) 获取推广二维码ticket字串
getQRUrl($ticket) 获取二维码图片地址
getUserList($next_openid) 批量获取关注用户列表
getUserInfo($openid) 获取关注者详细信息
getGroup() 获取用户分组列表
createGroup($name) 新增自定分组
updateGroup($groupid,$name) 更改分组名称
updateGroupMembers($groupid,$openid) 移动用户分组
sendCustomMessage($data) 发送客服消息
getOauthRedirect($callback,$state,$scope) 获取网页授权oAuth跳转地址
getOauthAccessToken() 通过回调的code获取网页授权access_token
getOauthRefreshToken($refresh_token) 通过refresh_token对access_token续期
getOauthUserinfo($access_token,$openid) 通过网页授权的access_token获取用户资料
getSignature($arrdata,'sha1') 生成签名字串
generateNonceStr($length) 获取随机字串
createPackage($out_trade_no,$body,$total_fee,$notify_url,$spbill_create_ip,$fee_type=1,$bank_type="WX",$input_charset="UTF-8",$time_start="",$time_expire="",$transport_fee="",$product_fee="",$goods_tag="",$attach="") 生成订单package字符串
getPaySign($package, $timeStamp, $nonceStr) 支付签名(paySign)生成方法
checkOrderSignature($orderxml='') 回调通知签名验证
sendPayDeliverNotify($openid,$transid,$out_trade_no,$status=1,$msg='ok') 发货通知
getPayOrder($out_trade_no) 查询订单信息
getAddrSign($url, $timeStamp, $nonceStr, $user_token='') 获取收货地址JS的签名
wechatext.class.php
非官方扩展API,需要配置公众平台账户和密码,能实现对已关注用户的点对点微信,此方式不保证长期有效。
类方法里提及的用户id在接口返回结构里表述为FakeId, 属同一概念, 在下面wechatauth类里则表示为Uin, 用户id对应的微信号必须通过getInfo()方法通过返回数组的Username值获取, 但非关注关系用户资料不能获取.
调用下列方法前必须经过login()方法和checkValid()验证方法才能获得调用权限. 有的账户无法通过登陆可能因为要求提供验证码, 可以手动登陆后把获取到的cookie写进程序存放cookie的文件解决.
程序使用了经过修改的snoopy兼容式HTTP类方法, 在类似BAE/SAE云服务器上可能不能正常运行, 因为云服务的curl方法是经过重写的, 某些header参数如网站来源参数不被支持.
类主要方法:
 
send($id,$content) 向某用户id发送微信文字信息
sendNews($id,$msgid) 发送图文消息, 可通过getNewsList获取$msgid
getUserList($page,$pagesize,$groupid) 获取用户信息
getGroupList($page,$pagesize) 获取群组信息
getNewsList($page,$pagesize) 获取图文信息列表
uploadFile($filepath,$type) 上传附件,包括图片/音频/视频
getFileList($type,$page,$pagesize) 获取素材库文件列表
sendImage($id,$fid) 发送图片消息
sendAudio($id,$fid) 发送音频消息
sendVideo($id,$fid) 发送视频消息
getInfo($id) 根据id获取用户资料,注: 非关注关系用户资料不能获取
getNewMsgNum($lastid) 获取从$lastid算起新消息的数目
getTopMsg() 获取最新一条消息的数据, 此方法获取的消息id可以作为检测新消息的$lastid依据
getMsg($lastid,$offset=0,$perpage=50,$day=0,$today=0,$star=0) 获取最新的消息列表, 列表将返回消息id, 用户id, 消息类型, 文字消息等参数
消息返回结构: {"id":"消息id","type":"类型号(1为文字,2为图片,3为语音)","fileId":"0","hasReply":"0","fakeId":"用户uid","nickName":"昵称","dateTime":"时间戳","content":"文字内容"}
getMsgImage($msgid,$mode='large') 若消息type类型为2, 调用此方法获取图片数据
getMsgVoice($msgid) 若消息type类型为3, 调用此方法获取语音数据
wechatauth.class.php
通过微信二维码登陆微信的API, 能实现第三方网站同步登陆, 首先程序分别通过get_login_code和get_code_image方法获取授权二维码图片, 然后利用微信手机客户端扫描二维码图片后将自动跳出授权页面, 用户点击授权后即可获取对应的用户资料和头像信息. 详细验证步骤请看test3.php例子.
类主要方法:
 
get_login_code() 获取登陆授权码, 通过授权码才能获取二维码
get_code_image($code='') 将上面获取的授权码转换为图片二维码
verify_code() 鉴定是否登陆成功,返回200为最终授权成功.
get_login_cookie() 鉴定成功后调用此方法即可获取用户基本信息
sendNews($account,$title,$summary,$content,$pic,$srcurl='') 向一个微信账户发送图文信息
get_avatar($url) 获取用户头像图片数据
logout() 注销登陆
wechat.js 微信内嵌网页特殊功能js调用:
 
WeixinJS.hideOptionMenu() 隐藏右上角按钮
WeixinJS.hideToolbar() 隐藏工具栏
通过定义全局变量dataForWeixin配置触发分享的内容:
var dataForWeixin={
     appId:"",
     MsgImg:"消息图片路径",
     TLImg:"时间线图路径",
     url:"分享url路径",
     title:"标题",
     desc:"描述",
     fakeid:"",
     callback:function(){}
  };
官方Wechat调用示例:
 
//test1.php
include "wechat.class.php";
$options = array(
        'token'=>'tokenaccesskey' //填写你设定的key
    );
$weObj = new Wechat($options);
$weObj->valid(); //注意, 应用验证通过后,可将此句注释掉, 但会降低网站安全性
$type = $weObj->getRev()->getRevType();
switch($type) {
    case Wechat::MSGTYPE_TEXT:
            $weObj->text("hello, I'm wechat")->reply();
            exit;
            break;
    case Wechat::MSGTYPE_EVENT:
            break;
    case Wechat::MSGTYPE_IMAGE:
            break;
    default:
            $weObj->text("help info")->reply();
}
扩展包Wechatext调用示例:
 
//test2.php
    include "wechatext.class.php";
 
    function logdebug($text){
        file_put_contents('./data/log.txt',$text."n",FILE_APPEND);    
    };
 
    $options = array(
        'account'=>'demo@domain.com',
        'password'=>'demo',
        'datapath'=>'./data/cookie_',
            'debug'=>true,
            'logcallback'=>'logdebug'  
    );
    $wechat = new Wechatext($options);
    if ($wechat->checkValid()) {
        // 获取用户信息
        $data = $wechat->getInfo('3974255');
        var_dump($data);
        // 获取最新一条消息
        $topmsg = $wechat->getTopMsg();
        var_dump($topmsg);
        // 主动回复消息
        if ($topmsg && $topmsg['has_reply']==0)
        $wechat->send($topmsg['fakeid'],'hi '.$topmsg['nick_name'].',rev:'.$topmsg['content']);
    }
微信二维码Wechatauth登陆示例:
 
//test3.php
    include "../wechatauth.class.php";
    session_start();
    $sid  = session_id();
    $options = array(
        'account'=>$sid,
        'datapath'=>'../data/cookiecode_',
    );
    $wechat = new Wechatauth($options);
 
    if (isset($_POST['code'])) {
        $logincode = $_POST['code'];
        $vres = $wechat->set_login_code($logincode)->verify_code();
        if ($vres===false) {
            $result = array('status'=>0);
        } else {
            $result = array('status'=>$vres);
            if ($vres==200) {
                $result['info'] = $wechat->get_login_info();
                $result['cookie'] = $wechat->get_login_cookie(true);
            }
        }
 
        die(json_encode($result)); 
    }
    $logincode =  $wechat->get_login_code(); //获取授权码
    $qrimg = $wechat->get_code_image(); //待输出的二维码图片
HTML部分请看test/test3.php, 主要是定时ajax查询是否已经授权成功