android如何集成微信开发
2017-06-15 18:26:00 weixin_34327223 阅读数 30

背景:

  • 这几天又在接触微信PHP方面的开发,认为之前写的文章确实有些乱,刚好发现了一个不错的集成类(看原始代码,出自“云知梦军哥”,不算打广告,只是尊重别人的开发成果,谢谢)
  • 里面涉及了非常全面的函数,在此针对我自己的实际使用过程简单的描述一下,希望能给同道小白们一个诚恳的引导

前期准备:

1).微信公众平台的配置,这里不赘述,具体的可以参考我前面所写的1、2章,个人认为还是比较全面的
2).将文件Weixin.class.php放在对应的library目录中,
  • 不过本人人开发是基于ThinkPHP框架,如果使用了其它的方式,
  • 注意更改引用路径,相信还是较为容易的,参考截图如下:


    2578557-664e1085797279ac
3).对应的数据库中需要新建一个表,当然,后期优化可以考虑去掉或自行设计,
  • 在这里个人觉得比较合理,也方便自己测试(公众号在线接口调试工具)
2578557-6ed5d5f95d9befe7
4).注意token的获取
  • 此表是用来微信授权时自动存储公众号信息及其token 获取时间,而对应操作此表的代码位于Weixin.class中的 getaccesstoken()方法,如果不是采用的ThinkPHP框架,可针对此方法中的sql语句进行替换截取部分代码可供参考
2578557-a8eb3f97af74294e

一.开发者模式配置

1).参考配置截图
2578557-096a4db4fe259b43
2).注意匹配对应目录以及令牌
/**
 * 微信开发配置控制器
 * Class WeixinController
 * @package M\Controller
 */
class WeixinController extends Controller
{
    public function index()
    {
        import('Org.Wechat.Weixin');
        //参数传值 token、AppID、AppSecert
        $wechat = new \Weixin('zxxxi', 'wxxxxxxxxx89', 'efxxxxxxxxxxxxxxxxxxxxxxxb7');
        if (!isset($_GET['echostr'])) {
            //TODO 调用响应消息函数 自动回复
            $wechat->responseMsg();
        } else {
            //实现网址接入,调用验证消息函数
            $wechat->valid();
        }
    }
}
3).必要文件上传
  • 微信公众平台近期发现规定需要在相应域名的根目录下上传文件,具体可从公众号下载。


    2578557-8e8de5f894f39ad9

二.请求授权登录,获取微信用户信息

1).代码参考
  • 下面是本人摘抄并精简的部分代码,具体的业务逻辑需要自己相应进行补充或删减
import('Org.Wechat.Weixin');
//参数传值 token、AppID、AppSecert
$wechat=new \Weixin('zxxxxi','wxxxxxxxxxxxxx9','efxxxxxxxxxxxxxxxxxxxxxxxxxxxx7');
//可理解为这是当下的链接地址
$url = "http://www.xxxxx.com".$_SERVER['REQUEST_URI'];
//TODO 判断 memcache是否有值,是否过期 (此处只是一个判断举例)
if(!S(session('XXXNAME').'_NAMEID')){
   if(!$_GET['code']){
      $redirect_uri = $url;
      $urls=$wechat->getOauthRedirect($redirect_uri);
      header("Location:".$urls);
      die;
   }
}
$reT=$wechat->getOauthAccessToken();
//TODO 如果获得 token值
if($reT){
   $openid = $reT['openid'];
   $user_info = $wechat->getOauthUserinfo($reT['access_token'],$openid);
   //查询数据库是否存在
   $userData = M('users')
      ->where("openid = '$openid'")
      ->Field('user_id,user_name,abnormal')
      ->find();
   if ($userData['user_id']) {
      //执行操作 或者跳转页面
      header("Location:???????");
   }else{
      //没有帐号需要转到用户名填写页面来完成授权
      $maxuid = M('users')->max('user_id');
      $user['openid'] = $openid;
      $user['nickname'] = $user_info['nickname'];
      $user['sex'] = $user_info['sex'];
      $user['reg_time'] = time();
      $user['user_img'] = $user_info['headimgurl'];
      //TODO 进行新用户的添加
      $addTag = add('users',$user);
   }
}else{
//重新跳转,或其他操作...
}
2).手机微信端登录对应链接的结果
2578557-94b430a0f2357448
3).补充说明
$user_info = $wechat->getOauthUserinfo($reT['access_token'],$openid);
  • 此处返回的$user_info 为授权用户的详细信息,可追踪方法查看源代码中 OAUTH_USERINFO_URL 的定义,开发者文档有介绍其意义,之前的两篇文章里也做了简单介绍。

三、微信端分享功能

  • 以ThinkPHP3.2框架为例

1).配置微信分享相应数据

  • 下面的方法个人设计面向对象时是在继承的Controller构造函数中初始化调用的,大家可以按自己需求放置
/**
 * 配置微信分享功能
 */
public function getWxShare(){
    import('Org.Wechat.Weixin');
    $wechat=new \Weixin('zxxxxi','wxxxxxxxxxxxx9','efxxxxxxxxxxxxxxxxxxb7');
    $url = "http://www.xxxxxmi.com".$_SERVER['REQUEST_URI'];
    $res = $wechat->getJsSign($url);
    $res['wxurl'] = $url;
    $this->assign('wx',$res);
}

2).前台页面的配置信息

  • 多数就是html前台文件,补充如下的js代码,具体的数据可自己修改
<script src="http://res.wx.qq.com/open/js/jweixin-1.1.0.js" type="text/javascript"></script>
<script>
    /**
     * Created by 百鬼夜行 on 2017/4/27.
     */
    //通过config接口注入权限验证配置
    wx.config({
        debug : false,
        appId : "{$wx.appid}",
        timestamp : "{$wx.timestamp}",
        nonceStr : "{$wx.noncestr}",
        url : "{$wx.url}",
        signature : "{$wx.signature}",
        jsApiList : ['onMenuShareTimeline', 'onMenuShareAppMessage', 'onMenuShareQQ', 'onMenuShareWeibo']
    });
    wx.ready(function(){
        //朋友圈
        wx.onMenuShareTimeline({
            title : "真米如初:美好的东西 如期相遇 值得期待",  // 分享标题
            link : "{$wx.wxurl}",  // 分享链接
            desc : "关注饮食,品质生活。您的健康,是我们最好的坚持,有真米,生活才够美!",  //分享描述
            imgUrl : "http://img.52zhenmi.com/Public/upload/20170426/149321008494428.jpg", // 分享图标
        });
        //发送给好友
        wx.onMenuShareAppMessage({
            title : "真米如初:美好的东西 如期相遇 值得期待",  // 分享标题
            link : "{$wx.wxurl}",  // 分享链接
            desc : "关注饮食,品质生活。您的健康,是我们最好的坚持,有真米,生活才够美!",  //分享描述
            imgUrl : "http://img.52zhenmi.com/Public/upload/20170426/149321008494428.jpg", // 分享图标
        });
        //QQ好友
        wx.onMenuShareQQ({
            title : "真米如初:美好的东西 如期相遇 值得期待",  // 分享标题
            link : "{$wx.wxurl}",  // 分享链接
            desc : "关注饮食,品质生活。您的健康,是我们最好的坚持,有真米,生活才够美!",  //分享描述
            imgUrl : "http://img.52zhenmi.com/Public/upload/20170426/149321008494428.jpg", // 分享图标
        });
        //腾讯微博
        wx.onMenuShareWeibo({
            title : "真米如初:美好的东西 如期相遇 值得期待",  // 分享标题
            link : "{$wx.wxurl}",  // 分享链接
            desc : "关注饮食,品质生活。您的健康,是我们最好的坚持,有真米,生活才够美!",  //分享描述
            imgUrl : "http://img.52zhenmi.com/Public/upload/20170426/149321008494428.jpg", // 分享图标
        });
    });
</script>
3).最终实现的效果如下
2578557-4309725659af266e
补充提醒:
  • 首先要保证开发配置信息的准确性
  • 有时会出现token令牌失效的情况,注意本地测试时很可能会影响线上,应该就是获取新的令牌使得线上的数据库中不对应,注意一下。
  • 分享页面的操作,为了方便处理可能出现的失败情况,可以先用调试模式将wx.config中的 debug值更改为true,待正确无误后再改回来。针对具体的报错信息需要查询微信开发者文档,相信每一个想走程序猿道路的人,都会强制习惯补坑填坑...
    debug : true,

四、公众号发送消息

  • 可用于简单消息的发送,比如用户购物完成后对公众号管理员的消息提醒等.
1).前提
  • 所要发送信息的用户关注了当前的公众号
2).代码举例
/**
 * 此方法不支持 图片发送 注意文字的换行显示
 */
public function postMsg(){
    import('Org.Wechat.Weixin');
    $wechat=new \Weixin('zxxxxi','wxxxxxxxxxx9','efxxxxxxxxxxxxxxxxxxxxxxxxxb7');
    $content = "微信公众号发送:\n";
    $content .= "人生如戏,我们以为可以改变自己的命运,却没想到我们的结局早已注定。\n无论怎么做都摆脱不了戏里既定的安排,可谓殊途同归。";
    $content .= "如此看来,我们的拼搏和挣扎就像小丑在跳舞,徒惹人发笑罢了。";
    //TODO 微信用户唯一标记-openID 前提是对方已经关注公众号
    $wxOpenID = "oIaCOxxxxxxxxxxxxxxxxxxxxFe0";
    $wechat->postMaggerToUser($wxOpenID,$content);
}

3).实现效果

2578557-50b7d9622960d9fd

五、公众号自动回复

  • 功能主要用于用户操作公众号时的触发事件处理,比如关注时的消息发送、按钮点击的监听等
1).主要的配置其实来源于上面第一节对开发者模式的配置,而举例代码中WeixinController的index()重要的就是那不到十行的代码
2).监听响应消息的函数为 Weixin.class中的 responseMsg(),对于其中详细的数据处理可根据不同的触发事件路径进行代码的修改
2578557-de038e183ee67638
3).举例:关注公众号后的消息发送
2578557-1cb099b446f09dff
4).举例:根据用户的输入进行消息的自动回复,代码实际开发中可根据获得的文字进行项目数据库中的文字匹配,此处简单演示即可。
2578557-75e713efadd9fee6
5).效果实现截图
2578557-e0b85700da0c77dc

2578557-c0600f98a2f9d5d1

2578557-8976502c7327c90a

附录:

(1).获取用户Openid及个人信息
(2).微信端分享功能
(3).源代码下载 >>>

android如何集成微信开发 相关内容

2017-04-05 15:53:41 linidserggbvxdsefgh 阅读数 412


一个困扰了我两天的事,找了各种方法,终于被自己蠢哭的时候找到了尴尬

 应用的微信的(登录分享以及支付)在本地运行的debug版本上可以  运行,但是发布出来的release包全部不能用,(为此我尝试了多种打包方法没有卵用)

 问题:

    我的微信开放平台上面的应用签名是debug版本的签名  

解决:

    在微信平台上面修改应用签名微release版本的签名 

   (可能不会立即生效,需要等待时间哦)


    补充些,等了周三下午3点改的,周五上午10点生效



android如何集成微信开发 相关内容

2015-05-15 16:23:56 chenbin520 阅读数 4428

之前开发微信,苦于没有80端口,最麻烦的问题就是搭建测试环境和调试。花生壳这个工具可以很好的解决这个问题。

步骤

1、通过网址http://service.oray.com/,注册一个账号。并会获得一个免费的二级域名。比如cc.xicp.net,cc默认的是你的账户名

2、通过网址http://www.oray.com/activity/140902/,开通免费的花生壳内网版,需要支付一元。

3、进入会员中心,产品管理->域名管理,壳域名,你可以看到免费获得的域名。

4、下载客户端http://hsk.oray.com/download/,下载内网版

5、打开客户端,配置映射,选择当前主机,勾选使用外网HTTP80端口


OK,这样你就可以进行本机的调试了




android如何集成微信开发 相关内容

2016-04-25 15:33:09 long_shao_1 阅读数 282

一、注意微信签名的打包正确
如果你是根据微信官网上的步奏操作下去,正确的在官网上配置了微信的签名。一测试?为什么不正确呢?确实,本人也遇到了一个很大的坑。开始根据官网测试,到最后,发现老是抱异常,或者支付不成功。最后去网上查了很多个原因,最后解决的方案,就是打包,然后清理一下缓存数据。再测试,立马就成功了。
二、关于微信支付的二步流程
流程:做微信支付,肯定涉及到钱这方面的安全,微信的第一步流程肯定是要服务器进行向微信服务器传输的。然后客服端拿到微信的预支付ID之后,开始封装参数向微信客服端发起请求。

android如何集成微信开发 相关内容

2014-10-16 14:40:33 qq_16318981 阅读数 2442

代码分析:界面很简单


main.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" 
    android:background="@color/navpage">


    <TextView
        android:id="@+id/textView1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="@string/text_title" />


    <Button
        android:id="@+id/reg_btn"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="@string/reg_to_wx" />


    <Button
        android:id="@+id/goto_send_btn"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="@string/goto_sendMessage" />


    <Button
        android:id="@+id/launch_wx_btn"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="@string/start_wx" />


    <Button
        android:id="@+id/check_timeline_supported_btn"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="@string/check_on_version" />


</LinearLayout>



package com.example.teststudyshare.wxapi;


import java.io.ObjectOutputStream.PutField;


import android.R;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.provider.SyncStateContract.Constants;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.Toast;


import com.example.teststudyshare.GetFromWXActivity;
import com.example.teststudyshare.SendToWXActivity;
import com.example.teststudyshare.ShowFromWXActivity;
import com.tencent.mm.sdk.constants.ConstantsAPI;
import com.tencent.mm.sdk.modelbase.BaseReq;
import com.tencent.mm.sdk.modelbase.BaseResp;
import com.tencent.mm.sdk.modelmsg.ShowMessageFromWX;
import com.tencent.mm.sdk.modelmsg.WXAppExtendObject;
import com.tencent.mm.sdk.modelmsg.WXMediaMessage;
import com.tencent.mm.sdk.openapi.IWXAPI;
import com.tencent.mm.sdk.openapi.IWXAPIEventHandler;
import com.tencent.mm.sdk.openapi.WXAPIFactory;
/**
 * 接受微信的请求和响应
 *
 *
 */
public class WXEntryActivity extends Activity implements IWXAPIEventHandler {
    private static final int TIMELINE_SUPPORT_VERSION = 0X1200120;
private Button regBtn,gotoBtn,checkBtn,luanchBtn;
    private IWXAPI api;
private final String APP_ID = "88888888888";

@Override
protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);
//setContentView(R.layout.main);
api = WXAPIFactory.createWXAPI(this, APP_ID, false);

regBtn = (Button) findViewById(R.id.button1);
regBtn.setOnClickListener(new View.OnClickListener() {

@Override
public void onClick(View v) {
//注册到微信
api.registerApp(APP_ID);
}
});
gotoBtn = (Button) findViewById(R.id.button2);
gotoBtn.setOnClickListener(new OnClickListener() {

@Override
public void onClick(View v) {
startActivity(new Intent(WXEntryActivity.this,SendToWXActivity.class));
   finish();
}
});
//点击进入微信按钮
luanchBtn = (Button) findViewById(R.id.button3);
luanchBtn.setOnClickListener(new OnClickListener() {

@Override
public void onClick(View v) {
Toast.makeText(WXEntryActivity.this, "luanch startWX = " + api.openWXApp(), Toast.LENGTH_LONG).show();

}
});
checkBtn = (Button) findViewById(R.id.background);
checkBtn.setOnClickListener(new OnClickListener() {

@Override
public void onClick(View v) {
int wxSDKVersion = api.getWXAppSupportAPI();
if(wxSDKVersion >= TIMELINE_SUPPORT_VERSION)
{
Toast.makeText(WXEntryActivity.this, "wx_Sdk_version =" + Integer.toHexString(wxSDKVersion) +"\n timeLine support", Toast.LENGTH_LONG).show();
}else
Toast.makeText(WXEntryActivity.this, "wx_sdk_version = "+ Integer.toHexString(wxSDKVersion)+"\n timeLine not support", Toast.LENGTH_LONG).show();

}
});
api.handleIntent(getIntent(), this);
}
@Override
protected void onNewIntent(Intent intent) {

super.onNewIntent(intent);
setIntent(intent);
api.handleIntent(intent, this);
}
  //微信发送请求到第三方,会调用这个方法
@Override
public void onReq(BaseReq req) {
// req请求
switch(req.getType())
{
case ConstantsAPI.COMMAND_GETMESSAGE_FROM_WX:
gotoGetMseeage();
break;
case ConstantsAPI.COMMAND_SHOWMESSAGE_FROM_WX:
gotoShowMessage((ShowMessageFromWX.Req) req);
break;
default:
break;
}
}


private void gotoShowMessage(ShowMessageFromWX.Req showReq) {
  WXMediaMessage wxMsg = showReq.message;
  WXAppExtendObject obj = (WXAppExtendObject) wxMsg.mediaObject;
  StringBuffer msg = new StringBuffer();
  msg.append("description: ");
msg.append(wxMsg.description);
msg.append("\n");
msg.append("extInfo: ");
msg.append(obj.extInfo);
msg.append("\n");
msg.append("filePath: ");
msg.append(obj.filePath);

Intent intent = new Intent(this, ShowFromWXActivity.class);
intent.putExtra(Constants.ShowMsgActivity.STitle, wxMsg.title);
intent.putExtra(Constants.ShowMsgActivity.SMessage, msg.toString());
intent.putExtra(Constants.ShowMsgActivity.BAThumbData, wxMsg.thumbData);
startActivity(intent);
finish();

}
private void gotoGetMseeage() {
Intent intent = new Intent(this, GetFromWXActivity.class);
intent.putExtras(getIntent());
startActivity(intent);
finish();

}
@Override
public void onResp(BaseResp resp) {
// resp响应
int result = 0;

switch (resp.errCode) {
case BaseResp.ErrCode.ERR_OK:
result = R.string.errcode_success;
break;
case BaseResp.ErrCode.ERR_USER_CANCEL:
result = R.string.errcode_cancel;
break;
case BaseResp.ErrCode.ERR_AUTH_DENIED:
result = R.string.errcode_deny;
break;
default:
result = R.string.errcode_unknown;
break;
}

Toast.makeText(this, result, Toast.LENGTH_LONG).show();

}
     

}


android如何集成微信开发 相关内容

微信开发-如何优雅的注入token

博文 来自: Hendiaome
没有更多推荐了,返回首页