700字范文,内容丰富有趣,生活中的好帮手!
700字范文 > php调用微信分享接口开发 微信开发笔记-调用自定义分享接口

php调用微信分享接口开发 微信开发笔记-调用自定义分享接口

时间:2024-07-06 04:48:33

相关推荐

php调用微信分享接口开发 微信开发笔记-调用自定义分享接口

引言:

工作中开发微信网站,简称微网站。由于微网站的分享内容是系统自动选取的当前网址,客户需要改变分享的内容,即点击屏幕右上角的分享按钮,选择发送给朋友和发送到朋友圈,其中的内容和图片需要自定义。于是查找文档微信JS-SDK说明文档一文和网站众多高手的经验,大体知道了调用的步骤,但是具体如何调用才能成功却是不了解的。经过一番试验,终于成功调用发送朋友和发送到朋友圈两个接口,此处记录调用的具体过程。

步骤一:引用js文件。

在需要调用JS接口的页面引入如下JS文件,(支持https):http://res./open/js/jweixin-1.0.0.js

步骤二:通过config接口注入权限验证配置

wx.config({

debug: true, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。

appId: '', // 必填,公众号的唯一标识

timestamp: , // 必填,生成签名的时间戳

nonceStr: '', // 必填,生成签名的随机串

signature: '',// 必填,签名,见附录1

jsApiList: [] // 必填,需要使用的JS接口列表,所有JS接口列表见附录2

});

网上众多网友也是这样写的,但是具体如果配却谈之甚少,接下来介绍本文是如何调用的。

debug和appId,都不用说,很简单。

timespan生成签名的时间戳:

///

/// 生成时间戳

/// 从 1970 年 1 月 1 日 00:00:00 至今的秒数,即当前的时间,且最终需要转换为字符串形式

///

///

public string getTimestamp()

{

TimeSpan ts = DateTime.UtcNow - new DateTime(1970, 1, 1, 0, 0, 0, 0);

return Convert.ToInt64(ts.TotalSeconds).ToString();

}

nonceStr生成签名的随机串:

///

/// 生成随机字符串

///

///

public string getNoncestr()

{

Random random = new Random();

return MD5Util.GetMD5(random.Next(1000).ToString(), "GBK");

}

///

/// MD5Util 的摘要说明。 ///

public class MD5Util

{ public MD5Util()

{ //

// TODO: 在此处添加构造函数逻辑

//

}

/** 获取大写的MD5签名结果 */

public static string GetMD5(string encypStr, string charset)

{ string retStr;

MD5CryptoServiceProvider m5 = new MD5CryptoServiceProvider();

//创建md5对象

byte[] inputBye; byte[] outputBye;

//使用GB2312编码方式把字符串转化为字节数组.

try

{

inputBye = Encoding.GetEncoding(charset).GetBytes(encypStr);

} catch (Exception ex)

{

inputBye = Encoding.GetEncoding("GB2312").GetBytes(encypStr);

}

outputBye = puteHash(inputBye);

retStr = System.BitConverter.ToString(outputBye);

retStr = retStr.Replace("-", "").ToUpper();

return retStr;

}

}

View Code///

/// MD5Util 的摘要说明。

///

public class MD5Util

{

public MD5Util()

{

//

// TODO: 在此处添加构造函数逻辑

//

}

/** 获取大写的MD5签名结果 */

public static string GetMD5(string encypStr, string charset)

{

string retStr;

MD5CryptoServiceProvider m5 = new MD5CryptoServiceProvider();

//创建md5对象

byte[] inputBye;

byte[] outputBye;

//使用GB2312编码方式把字符串转化为字节数组.

try

{

inputBye = Encoding.GetEncoding(charset).GetBytes(encypStr);

}

catch (Exception ex)

{

inputBye = Encoding.GetEncoding("GB2312").GetBytes(encypStr);

}

outputBye = puteHash(inputBye);

retStr = System.BitConverter.ToString(outputBye);

retStr = retStr.Replace("-", "").ToUpper();

return retStr;

}

}

singature签名的生成比较麻烦。

首先生成获取access_token(有效期7200秒,开发者必须在自己的服务全局缓存access_token)

public string Getaccesstoken()

{

string appid = System.Configuration.ConfigurationManager.AppSettings["WXZjAppID"].ToString();

string secret = System.Configuration.ConfigurationManager.AppSettings["WXZjAppSecret"].ToString();

string urljson = "https://api./cgi-bin/token?grant_type=client_credential&appid=" + appid + "&secret=" + secret;

string strjson = "";

UTF8Encoding encoding = new UTF8Encoding();

HttpWebRequest myRequest =

(HttpWebRequest)WebRequest.Create(urljson);

myRequest.Method = "GET";

myRequest.ContentType = "application/x-www-form-urlencoded";

HttpWebResponse response;

Stream responseStream;

StreamReader reader;

string srcString;

response = myRequest.GetResponse() as HttpWebResponse;

responseStream = response.GetResponseStream();

reader = new System.IO.StreamReader(responseStream, Encoding.UTF8);

srcString = reader.ReadToEnd();

reader.Close();

if (srcString.Contains("access_token"))

{

//CommonJsonModel model = new CommonJsonModel(srcString);

HP.CPS.monJsonModel model = new monJsonModel(srcString);

strjson = model.GetValue("access_token");

Session["access_tokenzj"] = strjson;

}

return strjson;

}

public class CommonJsonModelAnalyzer

{ protected string _GetKey(string rawjson)

{ if (string.IsNullOrEmpty(rawjson)) return rawjson;

rawjson = rawjson.Trim(); string[] jsons = rawjson.Split(new char[] { ':' }); if (jsons.Length < 2) return rawjson; return jsons[0].Replace("\"", "").Trim();

} protected string _GetValue(string rawjson)

{ if (string.IsNullOrEmpty(rawjson)) return rawjson;

rawjson = rawjson.Trim(); string[] jsons = rawjson.Split(new char[] { ':' }, StringSplitOptions.RemoveEmptyEntries); if (jsons.Length < 2) return rawjson;

StringBuilder builder = new StringBuilder(); for (int i = 1; i < jsons.Length; i++)

{

builder.Append(jsons[i]);

builder.Append(":");

} if (builder.Length > 0)

builder.Remove(builder.Length - 1, 1); string value = builder.ToString(); if (value.StartsWith("\""))

value = value.Substring(1); if (value.EndsWith("\""))

value = value.Substring(0, value.Length - 1); return value;

} protected List _GetCollection(string rawjson)

{ //[{},{}]

List list = new List(); if (string.IsNullOrEmpty(rawjson)) return list;

rawjson = rawjson.Trim();

StringBuilder builder = new StringBuilder(); int nestlevel = -1; int mnestlevel = -1; for (int i = 0; i < rawjson.Length; i++)

{ if (i == 0) continue; else if (i == rawjson.Length - 1) continue; char jsonchar = rawjson[i]; if (jsonchar == '{')

{

nestlevel++;

} if (jsonchar == '}')

{

nestlevel--;

} if (jsonchar == '[')

{

mnestlevel++;

} if (jsonchar == ']')

{

mnestlevel--;

} if (jsonchar == ',' && nestlevel == -1 && mnestlevel == -1)

{

list.Add(builder.ToString());

builder = new StringBuilder();

} else

{

builder.Append(jsonchar);

}

} if (builder.Length > 0)

list.Add(builder.ToString()); return list;

}

} public class CommonJsonModel : CommonJsonModelAnalyzer

{ private string rawjson; private bool isValue = false; private bool isModel = false; private bool isCollection = false; public CommonJsonModel(string rawjson)

{ this.rawjson = rawjson; if (string.IsNullOrEmpty(rawjson)) throw new Exception("missing rawjson");

rawjson = rawjson.Trim(); if (rawjson.StartsWith("{"))

{

isModel = true;

} else if (rawjson.StartsWith("["))

{

isCollection = true;

} else

{

isValue = true;

}

} public string Rawjson

{ get { return rawjson; }

} public bool IsValue()

{ return isValue;

} public bool IsValue(string key)

{ if (!isModel) return false; if (string.IsNullOrEmpty(key)) return false; foreach (string subjson in base._GetCollection(this.rawjson))

{

CommonJsonModel model = new CommonJsonModel(subjson); if (!model.IsValue()) continue; if (model.Key == key)

{

CommonJsonModel submodel = new CommonJsonModel(model.Value); return submodel.IsValue();

}

} return false;

} public bool IsModel()

{ return isModel;

} public bool IsModel(string key)

{ if (!isModel) return false; if (string.IsNullOrEmpty(key)) return false; foreach (string subjson in base._GetCollection(this.rawjson))

{

CommonJsonModel model = new CommonJsonModel(subjson); if (!model.IsValue()) continue; if (model.Key == key)

{

CommonJsonModel submodel = new CommonJsonModel(model.Value); return submodel.IsModel();

}

} return false;

} public bool IsCollection()

{ return isCollection;

} public bool IsCollection(string key)

{ if (!isModel) return false; if (string.IsNullOrEmpty(key)) return false; foreach (string subjson in base._GetCollection(this.rawjson))

{

CommonJsonModel model = new CommonJsonModel(subjson); if (!model.IsValue()) continue; if (model.Key == key)

{

CommonJsonModel submodel = new CommonJsonModel(model.Value); return submodel.IsCollection();

}

} return false;

} ///

/// 当模型是对象,返回拥有的key ///

///

public List GetKeys()

{ if (!isModel) return null;

List list = new List(); foreach (string subjson in base._GetCollection(this.rawjson))

{ string key = new CommonJsonModel(subjson).Key; if (!string.IsNullOrEmpty(key))

list.Add(key);

} return list;

} ///

/// 当模型是对象,key对应是值,则返回key对应的值 ///

///

///

public string GetValue(string key)

{ if (!isModel) return null; if (string.IsNullOrEmpty(key)) return null; foreach (string subjson in base._GetCollection(this.rawjson))

{

CommonJsonModel model = new CommonJsonModel(subjson); if (!model.IsValue()) continue; if (model.Key == key) return model.Value;

} return null;

} ///

/// 模型是对象,key对应是对象,返回key对应的对象 ///

///

///

public CommonJsonModel GetModel(string key)

{ if (!isModel) return null; if (string.IsNullOrEmpty(key)) return null; foreach (string subjson in base._GetCollection(this.rawjson))

{

CommonJsonModel model = new CommonJsonModel(subjson); if (!model.IsValue()) continue; if (model.Key == key)

{

CommonJsonModel submodel = new CommonJsonModel(model.Value); if (!submodel.IsModel()) return null; else

return submodel;

}

} return null;

} ///

/// 模型是对象,key对应是集合,返回集合 ///

///

///

public CommonJsonModel GetCollection(string key)

{ if (!isModel) return null; if (string.IsNullOrEmpty(key)) return null; foreach (string subjson in base._GetCollection(this.rawjson))

{

CommonJsonModel model = new CommonJsonModel(subjson); if (!model.IsValue()) continue; if (model.Key == key)

{

CommonJsonModel submodel = new CommonJsonModel(model.Value); if (!submodel.IsCollection()) return null; else

return submodel;

}

} return null;

} ///

/// 模型是集合,返回自身 ///

///

public List GetCollection()

{

List list = new List(); if (IsValue()) return list; foreach (string subjson in base._GetCollection(rawjson))

{

list.Add(new CommonJsonModel(subjson));

} return list;

} ///

/// 当模型是值对象,返回key ///

private string Key

{ get

{ if (IsValue()) return base._GetKey(rawjson); return null;

}

} ///

/// 当模型是值对象,返回value ///

private string Value

{ get

{ if (!IsValue()) return null; return base._GetValue(rawjson);

}

}

}

View Codepublic class CommonJsonModelAnalyzer

{

protected string _GetKey(string rawjson)

{

if (string.IsNullOrEmpty(rawjson))

return rawjson;

rawjson = rawjson.Trim();

string[] jsons = rawjson.Split(new char[] { ':' });

if (jsons.Length < 2)

return rawjson;

return jsons[0].Replace("\"", "").Trim();

}

protected string _GetValue(string rawjson)

{

if (string.IsNullOrEmpty(rawjson))

return rawjson;

rawjson = rawjson.Trim();

string[] jsons = rawjson.Split(new char[] { ':' }, StringSplitOptions.RemoveEmptyEntries);

if (jsons.Length < 2)

return rawjson;

StringBuilder builder = new StringBuilder();

for (int i = 1; i < jsons.Length; i++)

{

builder.Append(jsons[i]);

builder.Append(":");

}

if (builder.Length > 0)

builder.Remove(builder.Length - 1, 1);

string value = builder.ToString();

if (value.StartsWith("\""))

value = value.Substring(1);

if (value.EndsWith("\""))

value = value.Substring(0, value.Length - 1);

return value;

}

protected List _GetCollection(string rawjson)

{

//[{},{}]

List list = new List();

if (string.IsNullOrEmpty(rawjson))

return list;

rawjson = rawjson.Trim();

StringBuilder builder = new StringBuilder();

int nestlevel = -1;

int mnestlevel = -1;

for (int i = 0; i < rawjson.Length; i++)

{

if (i == 0)

continue;

else if (i == rawjson.Length - 1)

continue;

char jsonchar = rawjson[i];

if (jsonchar == '{')

{

nestlevel++;

}

if (jsonchar == '}')

{

nestlevel--;

}

if (jsonchar == '[')

{

mnestlevel++;

}

if (jsonchar == ']')

{

mnestlevel--;

}

if (jsonchar == ',' && nestlevel == -1 && mnestlevel == -1)

{

list.Add(builder.ToString());

builder = new StringBuilder();

}

else

{

builder.Append(jsonchar);

}

}

if (builder.Length > 0)

list.Add(builder.ToString());

return list;

}

}

public class CommonJsonModel : CommonJsonModelAnalyzer

{

private string rawjson;

private bool isValue = false;

private bool isModel = false;

private bool isCollection = false;

public CommonJsonModel(string rawjson)

{

this.rawjson = rawjson;

if (string.IsNullOrEmpty(rawjson))

throw new Exception("missing rawjson");

rawjson = rawjson.Trim();

if (rawjson.StartsWith("{"))

{

isModel = true;

}

else if (rawjson.StartsWith("["))

{

isCollection = true;

}

else

{

isValue = true;

}

}

public string Rawjson

{

get { return rawjson; }

}

public bool IsValue()

{

return isValue;

}

public bool IsValue(string key)

{

if (!isModel)

return false;

if (string.IsNullOrEmpty(key))

return false;

foreach (string subjson in base._GetCollection(this.rawjson))

{

CommonJsonModel model = new CommonJsonModel(subjson);

if (!model.IsValue())

continue;

if (model.Key == key)

{

CommonJsonModel submodel = new CommonJsonModel(model.Value);

return submodel.IsValue();

}

}

return false;

}

public bool IsModel()

{

return isModel;

}

public bool IsModel(string key)

{

if (!isModel)

return false;

if (string.IsNullOrEmpty(key))

return false;

foreach (string subjson in base._GetCollection(this.rawjson))

{

CommonJsonModel model = new CommonJsonModel(subjson);

if (!model.IsValue())

continue;

if (model.Key == key)

{

CommonJsonModel submodel = new CommonJsonModel(model.Value);

return submodel.IsModel();

}

}

return false;

}

public bool IsCollection()

{

return isCollection;

}

public bool IsCollection(string key)

{

if (!isModel)

return false;

if (string.IsNullOrEmpty(key))

return false;

foreach (string subjson in base._GetCollection(this.rawjson))

{

CommonJsonModel model = new CommonJsonModel(subjson);

if (!model.IsValue())

continue;

if (model.Key == key)

{

CommonJsonModel submodel = new CommonJsonModel(model.Value);

return submodel.IsCollection();

}

}

return false;

}

///

/// 当模型是对象,返回拥有的key

///

///

public List GetKeys()

{

if (!isModel)

return null;

List list = new List();

foreach (string subjson in base._GetCollection(this.rawjson))

{

string key = new CommonJsonModel(subjson).Key;

if (!string.IsNullOrEmpty(key))

list.Add(key);

}

return list;

}

///

/// 当模型是对象,key对应是值,则返回key对应的值

///

///

///

public string GetValue(string key)

{

if (!isModel)

return null;

if (string.IsNullOrEmpty(key))

return null;

foreach (string subjson in base._GetCollection(this.rawjson))

{

CommonJsonModel model = new CommonJsonModel(subjson);

if (!model.IsValue())

continue;

if (model.Key == key)

return model.Value;

}

return null;

}

///

/// 模型是对象,key对应是对象,返回key对应的对象

///

///

///

public CommonJsonModel GetModel(string key)

{

if (!isModel)

return null;

if (string.IsNullOrEmpty(key))

return null;

foreach (string subjson in base._GetCollection(this.rawjson))

{

CommonJsonModel model = new CommonJsonModel(subjson);

if (!model.IsValue())

continue;

if (model.Key == key)

{

CommonJsonModel submodel = new CommonJsonModel(model.Value);

if (!submodel.IsModel())

return null;

else

return submodel;

}

}

return null;

}

///

/// 模型是对象,key对应是集合,返回集合

///

///

///

public CommonJsonModel GetCollection(string key)

{

if (!isModel)

return null;

if (string.IsNullOrEmpty(key))

return null;

foreach (string subjson in base._GetCollection(this.rawjson))

{

CommonJsonModel model = new CommonJsonModel(subjson);

if (!model.IsValue())

continue;

if (model.Key == key)

{

CommonJsonModel submodel = new CommonJsonModel(model.Value);

if (!submodel.IsCollection())

return null;

else

return submodel;

}

}

return null;

}

///

/// 模型是集合,返回自身

///

///

public List GetCollection()

{

List list = new List();

if (IsValue())

return list;

foreach (string subjson in base._GetCollection(rawjson))

{

list.Add(new CommonJsonModel(subjson));

}

return list;

}

///

/// 当模型是值对象,返回key

///

private string Key

{

get

{

if (IsValue())

return base._GetKey(rawjson);

return null;

}

}

///

/// 当模型是值对象,返回value

///

private string Value

{

get

{

if (!IsValue())

return null;

return base._GetValue(rawjson);

}

}

}

接着获取jsapi_ticket:

用第一步拿到的access_token 采用http GET方式请求获得jsapi_ticket(有效期7200秒,开发者必须在自己的服务全局缓存jsapi_ticket)

public string Getjsapi_ticket()

{

string accesstoken = (string)Session["access_tokenzj"];

string urljson = "https://api./cgi-bin/ticket/getticket?access_token=" + accesstoken + "&type=jsapi";

string strjson = "";

UTF8Encoding encoding = new UTF8Encoding();

HttpWebRequest myRequest = (HttpWebRequest)WebRequest.Create(urljson);

myRequest.Method = "GET";

myRequest.ContentType = "application/x-www-form-urlencoded";

HttpWebResponse response = myRequest.GetResponse() as HttpWebResponse;

Stream responseStream = response.GetResponseStream();

StreamReader reader = new System.IO.StreamReader(responseStream, Encoding.UTF8);

string srcString = reader.ReadToEnd();

reader.Close();

if (srcString.Contains("ticket"))

{

HP.CPS.monJsonModel model = new monJsonModel(srcString);

strjson = model.GetValue("ticket");

Session["ticketzj"] = strjson;

}

return strjson;

}

最后生成signature:

public string Getsignature(string nonceStr, string timespanstr)

{

if (Session["access_tokenzj"] == null)

{

Getaccesstoken();

}

if (Session["ticketzj"] == null)

{

Getjsapi_ticket();

}

string url = Request.Url.ToString();

string str = "jsapi_ticket=" + (string)Session["ticketzj"] + "&noncestr=" + nonceStr +

"&timestamp=" + timespanstr + "&url=" + url;// +"&wxref=mp.";

string singature = SHA1Util.getSha1(str);

string ss = singature;

return ss;

}class SHA1Util

{

public static String getSha1(String str)

{

//建立SHA1对象

SHA1 sha = new SHA1CryptoServiceProvider();

//将mystr转换成byte[]

ASCIIEncoding enc = new ASCIIEncoding();

byte[] dataToHash = enc.GetBytes(str);

//Hash运算

byte[] dataHashed = puteHash(dataToHash);

//将运算结果转换成string

string hash = BitConverter.ToString(dataHashed).Replace("-", "");

return hash;

}

}class SHA1Util

{ public static String getSha1(String str)

{ //建立SHA1对象

SHA1 sha = new SHA1CryptoServiceProvider(); //将mystr转换成byte[]

ASCIIEncoding enc = new ASCIIEncoding(); byte[] dataToHash = enc.GetBytes(str); //Hash运算

byte[] dataHashed = puteHash(dataToHash); //将运算结果转换成string

string hash = BitConverter.ToString(dataHashed).Replace("-", ""); return hash;

}

}

View Code

本文调用实例:

wx.config({

debug: false,

appId: '',

timestamp: ,

nonceStr: '',

signature: '',

jsApiList: ['onMenuShareTimeline', 'onMenuShareAppMessage']

});

步骤三:调用接口

在进行完第二步的调用后,步骤三就显得非常轻巧了。wx.ready(function(){ // config信息验证后会执行ready方法,所有接口调用都必须在config接口获得结果之后,config是一个客户端的异步操作,所以如果需要在页面加载时就调用相关接口,则须把相关接口放在ready函数中调用来确保正确执行。对于用户触发时才调用的接口,则可以直接调用,不需要放在ready函数中。});

本文的调用实例是:

wx.ready(function () {

wx.onMenuShareAppMessage({

title: '',

desc: '',

link: '',

imgUrl: ''

});

wx.onMenuShareTimeline({

title: '',

link: '',

imgUrl: ''

});

})

wx.ready(function () {

wx.onMenuShareAppMessage({

title: '',

desc: '',

link: '',

imgUrl: ''

});

wx.onMenuShareTimeline({

title: '',

link: '',

imgUrl: ''

});

})

本文基本上总结到此处。

易出现的问题:

1、检查后台是否设置:右上角公众号名称--功能设置--JS接口安全域名

2、检查代码里的appid和公众号后台的id是否一致

3、图片的调用地址是绝对路径(相对路径好像不行)。

更多微信开发笔记-调用自定义分享接口相关文章请关注PHP中文网!

相关标签:微信开发

发布php中文网,转载请注明出处,感谢您的尊重!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。