2019-09-26 13:06:07 li2251421 阅读数 12
  • 微信公众号开发5-自定义菜单-微信开发php

    微信公众平台开发之自定义菜单管理是子恒老师《微信公众平台开发》视频教程的第5部。详细讲解了用php开发微信,对微信公众平台中的自定义管理开发。内容包含微信添加菜单,获取自定义菜单配置,删除菜单等等。欢迎反馈,微信/QQ:68183131

    5689 人正在学习 去看看 秦子恒

1 微信授权登陆

  1) 配置授权回调页面域名

    公众号开发平台->开发者中心->网页帐号->网页授权获取用户基本信息

  2) 用户授权并获取code

    https://open.weixin.qq.com/connect/oauth2/authorize?appid=APPID&redirect_uri=REDIRECT_URI&response_type=code&scope=SCOPE&state=STATE#wechat_redirect

参数 必须 说明
appid 公众号的唯一标识
redirect_uri 授权后重定向的回调链接地址
response_type 返回类型,请填写code
scope 应用授权作用域,snsapi_base (不弹出授权页面,直接跳转,只能获取用户openid),snsapi_userinfo (弹出授权页面,可通过openid拿到昵称、性别、所在地。并且,即使在未关注的情况下,只要用户授权,也能获取其信息)
state 重定向后会带上state参数,开发者可以填写任意参数值
#wechat_redirect 直接在微信打开链接,可以不填此参数。做页面302重定向时候,必须带此参数

    授权后重定向到 REDIRECT_URI?code=****

  3) 根据code获取access_token、openId等用户信息

    https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code    

参数 是否必须 说明
appid 公众号的唯一标识
secret 公众号的appsecret
code 填写第一步获取的code参数
grant_type 填写为authorization_code
 

    返回:

参数 描述
access_token 网页授权接口调用凭证,注意:此access_token与基础支持的access_token不同
expires_in access_token接口调用凭证超时时间,单位(秒)
refresh_token 用户刷新access_token
openid 用户唯一标识,请注意,在未关注公众号时,用户访问公众号的网页,也会产生一个用户和公众号唯一的OpenID
scope 用户授权的作用域,使用逗号(,)分隔
 

  4) 使用access_token、openId获取用户信息

    https://api.weixin.qq.com/sns/userinfo?access_token=ACCESS_TOKEN&openid=OPENID    

参数 描述
access_token 网页授权接口调用凭证,注意:此access_token与基础支持的access_token不同
openid 用户的唯一标识

    返回:

参数 描述
openid 用户的唯一标识
nickname 用户昵称
sex 用户的性别,值为1时是男性,值为2时是女性,值为0时是未知
province 用户个人资料填写的省份
city 普通用户个人资料填写的城市
country 国家,如中国为CN
headimgurl 用户头像,最后一个数值代表正方形头像大小(有0、46、64、96、132数值可选,0代表640*640正方形头像),用户没有头像时该项为空
privilege 用户特权信息,json 数组,如微信沃卡用户为(chinaunicom)

2 调用微信js接口

  微信开发文档说access_token的有效时间是7200秒(两小时);
但没有说过期后怎么办,这里的access_token容易和网页授权的access_token搞混;
后者有刷新地址,前者没有,需要过期后重新获取;
一般做网站开发,必须把access_token和jsapi_ticket存到服务器,并且根据过期时间定期更新,这个后期再说;

  1) 获取access_token

    https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=SECRET

  2) 获取临时票据 jsapi_ticket

    https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=ACCESS_TOKEN&type=jsapi

3 微信公众号支付

  1) 设置支付目录

    确保实际支付时的请求目录与此处配置的目录一致,否则将无法成功唤起微信支付。

    微信商户平台(pay.weixin.qq.com)-->产品中心-->开发配置

    

  2) 设置授权域名

    开发公众号支付时,在统一下单接口中要求必传用户openid,可在用户授权登陆时获取,需要配置网页授权域名(参:微信授权登陆)

  3) js调起支付

    getBrandWCPayRequest 接口

名称 变量名 必填 类型 示例值 描述
公众号id appId String(16) wx8888888888888888 商户注册具有支付权限的公众号成功后即可获得
时间戳 timeStamp String(32) 1414561699 当前的时间,其他详见时间戳规则
随机字符串 nonceStr String(32) 5K8264ILTKCH16CQ2502SI8ZNMTM67VS 随机字符串,不长于32位。推荐随机数生成算法
订单详情扩展字符串 package String(128) prepay_id=123456789 统一下单接口返回的prepay_id参数值,提交格式如:prepay_id=***
签名方式 signType String(32) MD5 签名类型,默认为MD5,支持HMAC-SHA256和MD5。注意此处需与统一下单的签名类型一致
签名 paySign String(64) C380BEC2BFD727A4B6845133519F3AD6 签名,详见签名生成算法

    支付接口err_msg返回结果值:

返回值 描述
get_brand_wcpay_request:ok 支付成功
get_brand_wcpay_request:cancel 支付过程中用户取消
get_brand_wcpay_request:fail 支付失败

    由于前端交互复杂,取消和失败流程可以统一处理,不必细分。

    代码示例:

function onBridgeReady(){
   WeixinJSBridge.invoke(
       'getBrandWCPayRequest', {
           "appId":"wx2421b1c4370ec43b",     //公众号名称,由商户传入     
           "timeStamp":"1395712654",         //时间戳,自1970年以来的秒数     
           "nonceStr":"e61463f8efa94090b1f366cccfbbb444", //随机串     
           "package":"prepay_id=u802345jgfjsdfgsdg888",     
           "signType":"MD5",         //微信签名方式:     
           "paySign":"70EA570631E4BB79628FBCA90534C63FF7FADD89" //微信签名 
       },
       function(res){     
           if(res.err_msg == "get_brand_wcpay_request:ok" ) {}     // 使用以上方式判断前端返回,微信团队郑重提示:res.err_msg将在用户支付成功后返回    ok,但并不保证它绝对可靠。 
       }
   ); 
}
if (typeof WeixinJSBridge == "undefined"){
   if( document.addEventListener ){
       document.addEventListener('WeixinJSBridgeReady', onBridgeReady, false);
   }else if (document.attachEvent){
       document.attachEvent('WeixinJSBridgeReady', onBridgeReady); 
       document.attachEvent('onWeixinJSBridgeReady', onBridgeReady);
   }
}else{
   onBridgeReady();
}

4 获取access_token接口时,需要设置访问来源IP为白名单

微信分享时,发现报错

错误代码-40164,错误信息-invalid ip, not in whitelist hint: [59FKqA0797e514]]

登录公众平台,进入开发->基本配置页面->IP白名单配置

 

 

 

 

2017-09-15 09:07:52 towtotow 阅读数 195
  • 微信公众号开发5-自定义菜单-微信开发php

    微信公众平台开发之自定义菜单管理是子恒老师《微信公众平台开发》视频教程的第5部。详细讲解了用php开发微信,对微信公众平台中的自定义管理开发。内容包含微信添加菜单,获取自定义菜单配置,删除菜单等等。欢迎反馈,微信/QQ:68183131

    5689 人正在学习 去看看 秦子恒

在正式进行微信公众号开发前,

需要在公众号的后台进行相关的配置,

只有配置正确,

才能做后续的开发。


2peizhi.jpg


同时也要做一些准备工作,

像购买好自己的域名,空间服务器,域名备案,网站建设等。

微信公众号开发基本配置视频教程在线观看

http://edu.csdn.net/course/detail/2586/40524

2018-07-29 23:25:41 hi_pengbo 阅读数 294
  • 微信公众号开发5-自定义菜单-微信开发php

    微信公众平台开发之自定义菜单管理是子恒老师《微信公众平台开发》视频教程的第5部。详细讲解了用php开发微信,对微信公众平台中的自定义管理开发。内容包含微信添加菜单,获取自定义菜单配置,删除菜单等等。欢迎反馈,微信/QQ:68183131

    5689 人正在学习 去看看 秦子恒

<?php

/**
  * wechat php test
  */


//define your token

define("TOKEN", "your token");
$wechatObj = new wechatCallbackapiTest();
$wechatObj->valid();
class wechatCallbackapiTest
{
    public function valid()
    {
        $echoStr = $_GET["echostr"];
        if($this->checkSignature()){
            echo $echoStr;
            exit;
        }
    }
    
    public function responseMsg()
    {
        $postStr = $GLOBALS["HTTP_RAW_POST_DATA"];
        if (!empty($postStr)){
                $postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA);
                $fromUsername = $postObj->FromUserName;
                $toUsername = $postObj->ToUserName;
                $keyword = trim($postObj->Content);
                $time = time();
                $textTpl = "<xml>
                            <ToUserName><![CDATA[%s]]></ToUserName>
                            <FromUserName><![CDATA[%s]]></FromUserName>
                            <CreateTime>%s</CreateTime>
                            <MsgType><![CDATA[%s]]></MsgType>
                            <Content><![CDATA[%s]]></Content>
                            <FuncFlag>0</FuncFlag>
                            </xml>";
                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;
        }
    }

    private function checkSignature()
    {
        $signature = $_GET["signature"];
        $timestamp = $_GET["timestamp"];
        $nonce = $_GET["nonce"];
        $token = TOKEN;
        $tmpArr = array($token, $timestamp, $nonce);
        sort($tmpArr);
        $tmpStr = implode($tmpArr);
        $tmpStr = sha1($tmpStr);
        if( $tmpStr == $signature ){
            return true;
        }else{
            return false;
        }
    }
}
?>

2018-03-14 17:40:36 geanwen 阅读数 2320
  • 微信公众号开发5-自定义菜单-微信开发php

    微信公众平台开发之自定义菜单管理是子恒老师《微信公众平台开发》视频教程的第5部。详细讲解了用php开发微信,对微信公众平台中的自定义管理开发。内容包含微信添加菜单,获取自定义菜单配置,删除菜单等等。欢迎反馈,微信/QQ:68183131

    5689 人正在学习 去看看 秦子恒

最近微信公众号网页开发项目遇到一个问题:

在吊起扫一扫功能的时候,Android端正常,iOS端总是提示config:fail 或者签名失败(sigxxxxxx)


Vue的项目,前几个类似的项目没遇到这种问题。这次微信配置和吊起的代码也是同事考培来的。


通过调试还有微信提供的签名验证工具都没问题;


因为Android端正常,说明逻辑是正确的,签名失败配置失败说明iOS端的参数是有问题的。

直接搜问题搜不到,最后从侧面看了下history模式,发现:


在路由配置的时候,即项目router下的路由文件中:

export default new Router({
  mode:'history',
     
     // ....省略不用代码

})

开启了history模式,注释掉后iOS吊起扫一扫正常;


因为history模式造成了,传入后台的url不对导致微信配置信息返回不正确,所以显示签名失败;

除了扫一扫外,分享等功能应该也会有这样的问题;


下面记录下weixin-js-sdk的配置和功能使用,以扫一扫为例:


步骤一:绑定JS接口安全域名


在'微信公众平台->设置->公众号设置->功能设置'中, 填写JS接口安全域名. 设置后, 公众号开发者才能在该域名下调用微信开放的JS接口. 


注:后台的端口号必须以 80开头;微信官方要求;



步骤二:引入JS文件


在项目根目录下的index.html文件中直接引入:

<!-- WXJSAPI -->
<script src="https://res.wx.qq.com/open/js/jweixin-1.2.0.js"></script>

注:如果你的页面启用了https,务必引入 https://res.wx.qq.com/open/js/jweixin-1.0.0.js ,否则将无法在iOS9.0以上系统中成功使用JSSDK


步骤三:配置微信config


然后在你需要调用微信功能的界面中注册即可,如果项目需要多次调用或者需要微信多个功能,可以全局注册;


下面以微信扫一扫为例:


在界面初始化时注册wx.config:



// 初始化界面调用
// 传入的参数是要使用的功能对应的接口
// 其他功能对应的名字在官方文档中找(下面的是扫一扫)
mounted() {
            this.RegisterWxJsApi(["scanQRCode"]);
}

// 先通过后台接口获取微信配置的一些信息,一些保密或者动态信息放在后台处理是正常逻辑
// 后台具体逻辑在下面后台部分记录
// 下面的请求参数是按照ReliableA_Wechat项目走的,因为是公司文档,所以参数注释掉了
RegisterWxJsApi: function(jsApiList) {
    var url = "/后台配置信息获取接口";
    var req = {
        AppType: "xxxx",
        RequestUrl: window.location.href.split('#')[0]
    };
    this.$http.get(url, {
        params: req
    }).then(response => {
        wx.config({
            debug: false, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。
            appId: response.data.AppId, // 必填,公众号的唯一标识
            timestamp: response.data.TimeStamp, // 必填,生成签名的时间戳
            nonceStr: response.data.NonceStr, // 必填,生成签名的随机串
            signature: response.data.Sign, // 必填,签名,见附录1
            jsApiList: jsApiList // 必填,需要使用的JS接口列表,所有JS接口列表见附录2
        });
    });
}


 步骤四:吊起微信功能



按钮点击时吊起微信扫一扫


// 点击事件
clickEvent: function() {
                var _this = this;
                wx.ready(function() {
                    wx.scanQRCode({
                        needResult: 1, // 默认为0,扫描结果由微信处理,1则直接返回扫描结果,
                        scanType: ["barCode"], // 可以指定扫二维码还是一维码,默认二者都有
                        success: function(res) {
                            var result = res.resultStr; // 当needResult 为 1 时,扫码返回的结果
                            var resultArr = result.split(",");
                            _this.Bind(resultArr[1]);
                        }
                    });
                    wx.error(function(res) {
                        var str = JSON.stringify(res);
                        alert(str);
                    })
                });
            },



2018-12-25 12:08:43 TOP__ONE 阅读数 153
  • 微信公众号开发5-自定义菜单-微信开发php

    微信公众平台开发之自定义菜单管理是子恒老师《微信公众平台开发》视频教程的第5部。详细讲解了用php开发微信,对微信公众平台中的自定义管理开发。内容包含微信添加菜单,获取自定义菜单配置,删除菜单等等。欢迎反馈,微信/QQ:68183131

    5689 人正在学习 去看看 秦子恒

写博客向来是直接干货走起,废话不多说:

1.注册微信公众号就不多说了,

2.在进行配置公众号之前先成为开发者,成为开发者需要进行身份验证

3.进行微信公众号的配置

    1.微信AppId和AppSecret直接可以在控制平台拿到

    2.进行域名设置

JS接口安全域名: 此域名是进行调用微信js-sdk时需要验证的域名。所有js-sdk元素都有在这个域名下。不需要添加http开头。

网页授权域名:是进行关注公众号进行网页授权用的回调域名。请注意,这里填写的是域名(是一个字符串),而不是URL,因此请勿加 http:// 等协议头,但是必须指到项目上,可自行判断是否加项目名,一般线上环境不需要加项目名,本地花生壳测试环境会添加项目名;详情查看https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140842

注:非测试号还需要添加*.txt文件到项目跟目录进行验证

   3.进行服务器配置

URL必须为可直接访问路径,用于微信服务器进行确认服务器是通的。

Token为自定义的和微信服务器约定值,尽量用数字。

代码实例:

URL接口实现代码

    /**
	 * 微信请求 即url
	 * @return
	 */
	@RequestMapping(value="/wechatEvent")
	public void wechatEvent(HttpServletRequest request, HttpServletResponse response){
		try {
			String signature = request.getParameter("signature");// 微信加密签名
			String timestamp = request.getParameter("timestamp");// 时间戮
			String nonce = request.getParameter("nonce"); // 随机数
			String echostr = request.getParameter("echostr"); // 随机字符串

			if(!StringUtils.isEmpty(echostr)){
			  //签名验证  此处就是处理服务器验证的,将随机串返回微信服务器
			   if(CheckSignature.checkSignature(signature, timestamp, nonce)==true) {
				  jsonOut(echostr);
			   }
		  	}else{
				ServletInputStream in=request.getInputStream();
				response.setCharacterEncoding("utf-8");
				//将微信消息转换为实体类
				EventMessage message= XMLConverUtil.convertToObject(new EventMessage().getClass(), in);
				//关注事件
				if (message.getEvent().toLowerCase().equals(MessageType.SUBSCRIBE)) {
					StringBuffer url = request.getRequestURL();
					String tempContextUrl = url.delete(url.length() - request.getRequestURI().length(), url.length()).append(request.getContextPath()).toString();
					message.setUrl(tempContextUrl);
					logger.info(message.getFromUserName());					
				}
				JsonUtil.toJSONString("接收到用户发来消息==="+message);
				//处理微信消息
				String xml= WechatServiceUtil.getWechatMessageAndSendMessageToWechat(message);
				if (!StringUtils.isEmpty(xml)){
					response.getWriter().write(xml);//回复消息
				}

			}
		} catch (Exception e) {
			e.printStackTrace();
			logger.error("微信请求异常====》"+e);
		}
			
	}

校验方法checkSignature:

package com.chinatsp.wechat.util;

import com.chinatsp.wechat.bean.WechatBean;
import org.apache.log4j.Logger;

import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Arrays;

public class CheckSignature {
	private Logger log = Logger.getLogger(getClass());

    /**
	 * 加密/校验
	 * @param signature
     * @param timestamp
     * @param nonce
     * @return
     */
	 public static boolean checkSignature(String signature, String timestamp, String nonce) { 
        //此处TOKEN为微信服务器后台自定义的 token值,这里只是进行了封装bean,可自行获取处理
		String[] arr = new String[] { WechatBean.TOKEN, timestamp, nonce };

		// 将token、timestamp、nonce三个参数进行字典序排序
		Arrays.sort(arr);
		StringBuilder content = new StringBuilder();
		for (int i = 0; i < arr.length; i++) {
			content.append(arr[i]);
		}

		// 将三个参数字符串拼接成一个字符串进行sha1加密
		MessageDigest md = null;
		String tmpStr = null;
		try {
			md = MessageDigest.getInstance("SHA-1");
			byte[] digest = md.digest(content.toString().getBytes());
			tmpStr = byteToStr(digest);
		} catch (NoSuchAlgorithmException e) {
			e.printStackTrace();
		}
		content = null;

		// 将sha1加密后的字符串可与signature对比,标识该请求来源于微信
		return tmpStr != null ? tmpStr.equals(signature.toUpperCase()) : false;

	 }

    /**
	 *将byte数组转换成字体串
	 * @param byteArray
	 * @return
	 */
	private static String byteToStr(byte[] byteArray) {
		String strDigest = "";
		for (int i = 0; i < byteArray.length; i++) {
			strDigest += byteToHexStr(byteArray[i]);
		}
		return strDigest;
	}

	/**
     * 字节流转换为十六进制字符串
	 * @param mByte
     * @return
     */
	private static String byteToHexStr(byte mByte) {
		char[] Digit = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' };
		char[] tempArr = new char[2];
		tempArr[0] = Digit[(mByte >>> 4) & 0X0F];
		tempArr[1] = Digit[mByte & 0X0F];
		String s = new String(tempArr);
		return s;
	}

	public String getSignature(String jsapi_ticket,String noncestr,String timestamp,String url) {
		log.info("jsapi_ticket"+jsapi_ticket);
		String signature="";
		String a="jsapi_ticket="+jsapi_ticket+"&noncestr="+noncestr+"&timestamp="+timestamp+"&url="+url;
		MessageDigest md = null;
		try {
			md = MessageDigest.getInstance("SHA-1");
			// 将三个参数字符串拼接成一个字符串进行sha1加密
			byte[] digest = md.digest(a.getBytes());
			signature = byteToStr(digest);
		} catch (NoSuchAlgorithmException e) {
			e.printStackTrace();
		}
		return signature.toLowerCase();
	}
}

启动项目,进行服务器配置成功保存,提示配置成功即代表通讯成功。

到此,基本上配置介绍了 。

附录:下图再配一张测试公众号的配置概览图以供参考

 

 

如果看完此文章还有不明白的地方,请戳此处https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421135319

 

 

微信开发---开始

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