微信签名包类库之微信封装调用详解

why 101 2024-10-21 13:36:21

这篇文章主要介绍了微信封装的调用微信签名包的类库的相关资料,需要的朋友可以参考下

废话不多说了,直接给大家贴代码了,具体代码如下所示:


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

125

126

127

128

129

130

131

132

133

134

135

136

137

138

139

140

141

142

143

144

145

146

147

148

149

150

151

152

153

154

155

156

157

158

159

160

161

162

163

164

165

166

167

168

169

170

171

172

173

174

175

176

177

178

179

180

181

182

<?php

namespace Home\Model;

use Think\Model;

class WechatModel extends Model {

private $_token = &#39;&#39;; //令牌

    private $appid;

    private $appsecret;

  public function __construct()

  {

    $this->appid = C(&#39;APPID&#39;);//公众号的appid

    $this->appsecret = C(&#39;APPSECRET&#39;);//公众号的秘钥

  }

  //调用js-sdk的签名包

  public function getSignPackage() {

  $jsapiTicket = $this->getJsApiTicket();

  // 注意 URL 一定要动态获取,不能 hardcode.(获取当前网页的url)

  $protocol = (!empty($_SERVER[&#39;HTTPS&#39;]) && $_SERVER[&#39;HTTPS&#39;] !== &#39;off&#39; || $_SERVER[&#39;SERVER_PORT&#39;] == 443) ? "https://" : "http://";

  $url = "$protocol$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]";

  //时间戳

  $timestamp = time();

  //随机字符串获取

  $nonceStr = $this->createNonceStr();

  // 这里参数的顺序要按照 key 值 ASCII 码升序排序

  $string = "jsapi_ticket=$jsapiTicket&noncestr=$nonceStr&timestamp=$timestamp&url=$url";

  //生成字符串是用来签名用的

  $signature = sha1($string);

  $signPackage = array(

   "appId"   => $this->appid,

   "nonceStr" => $nonceStr,

   "timestamp" => $timestamp,

   "url"    => $url,

   "signature" => $signature,

   "rawString" => $string

  );

  return $signPackage;

 }

 //使用会员卡领取的签名包

 public function getHuiYuanSignPackage() {

  $apiTicket = $this->getApiTicket();

  // 注意 URL 一定要动态获取,不能 hardcode.(获取当前网页的url)

  $protocol = (!empty($_SERVER[&#39;HTTPS&#39;]) && $_SERVER[&#39;HTTPS&#39;] !== &#39;off&#39; || $_SERVER[&#39;SERVER_PORT&#39;] == 443) ? "https://" : "http://";

  $url = "$protocol$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]";

  //时间戳

  $timestamp = time();

  //随机字符串获取

  // $nonceStr = $this->createNonceStr();

  // 这里参数的顺序要按照 key 值 ASCII 码升序排序

  $string = $timestamp.$apiTicket."car_id";//card_id为自己创建的会员卡的id

  //生成字符串是用来签名用的

  $signature = sha1($string);

  $signPackage = array(

   "timestamp" => $timestamp,

   "signature" => $signature,

  );

  return $signPackage;

 }

 //获取会员卡的api_ticket

 public function getApiTicket(){

 $data = json_decode(file_get_contents("api_ticket.json"));

  if ($data->expire_time < time()) {

   $accessToken = $this->getAccessToken();

   $url = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?type=wx_card&access_token=$accessToken";

   $res = json_decode($this->httpGet($url));

   $ticket = $res->ticket;

   if ($ticket) {

    $data->expire_time = time() + 7000;

    $data->jsapi_ticket = $ticket;

    $fp = fopen("api_ticket.json", "w");

    fwrite($fp, json_encode($data));

    fclose($fp);

   }

  } else {

   $ticket = $data->jsapi_ticket;

  }

  return $ticket;

 }

 //获取随机字符串

 private function createNonceStr($length = 16) {

  $chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";

  $str = "";

  for ($i = 0; $i < $length; $i++) {

   $str .= substr($chars, mt_rand(0, strlen($chars) - 1), 1);

  }

  return $str;

 }

  //获取Access Token

  public function getAccessToken(){

  //将json字符串转换为json对象(json_encode是将数组转换为json字符串,json_decode("",true) 如果加true是将json字符串转化为php数组,不加true转换为PHP对象)

  $data = json_decode(file_get_contents("access_token.json"));

  if ($data->expire_time < time()) {

   // 如果是企业号用以下URL获取access_token

   $url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=$this->appid&secret=$this->appsecret";

   $res = json_decode($this->httpGet($url));

   $access_token = $res->access_token;

 if ($access_token) {

    $data->expire_time = time() + 7000;

    $data->access_token = $access_token;

    $fp = fopen("access_token.json", "w");

    fwrite($fp, json_encode($data));

    fclose($fp);

 }

  } else {

   $access_token = $data->access_token;

  }

  return $access_token;

  }

 //获取jsapi_ticket(jsapi_ticket是公众号用于调用微信JS接口的临时票据)

  private function getJsApiTicket() {

  // jsapi_ticket 应该全局存储与更新,以下代码以写入到文件中做示例

  $data = json_decode(file_get_contents("jsapi_ticket.json"));

  if ($data->expire_time < time()) {

   $accessToken = $this->getAccessToken();

   // 如果是企业号用以下 URL 获取 ticket

   // $url = "https://qyapi.weixin.qq.com/cgi-bin/get_jsapi_ticket?access_token=$accessToken";

   $url = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?type=jsapi&access_token=$accessToken";

   $res = json_decode($this->httpGet($url));

   $ticket = $res->ticket;

   if ($ticket) {

    $data->expire_time = time() + 7000;

    $data->jsapi_ticket = $ticket;

    $fp = fopen("jsapi_ticket.json", "w");

    fwrite($fp, json_encode($data));

    fclose($fp);

   }

  } else {

   $ticket = $data->jsapi_ticket;

  }

  return $ticket;

 }

  //获取用户的openid

  public function openId(){

  $url = $_SERVER[&#39;HTTP_HOST&#39;] . $_SERVER[&#39;REQUEST_URI&#39;];

    if (!isset($_GET[&#39;code&#39;])) {

     //获取组装的url

      $openidUrl = $this->snsapi_base($url);

      redirect($openidUrl);

    }else{

      $openidAccess_token = $this->openidAccess_token($_GET[&#39;code&#39;]);

      return $openidAccess_token;

    }

  }

   //获取微信用户的opnid

  public function getOpenId($openid,$access_token)

  {

    $userInfo = $this->getUserInfo($openid,$access_token);

    return $userInfo;

  }

   public function snsapi_base($redirect_uri, $scope = "snsapi_userinfo", $state = 0)

  {

    $appId = $this->appid;

    $url = "https://open.weixin.qq.com/connect/oauth2/authorize";

    $url .= "?appid=$appId";

    $url .= "&redirect_uri=http://$redirect_uri";

    $url .= "&response_type=code";

    $url .= "&scope=$scope";

    $url .= "&state=$state#wechat_redirect";

    return $url;

  }

public function openidAccess_token($code){

    $appId = $this->appid;

    $appSecret= $this->appsecret;

    $url = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=$appId&secret=$appSecret&code=$code&grant_type=authorization_code";

    return json_decode($this->httpGet($url),true);

  }

  //获取用户信息

  public function getUserInfo($openid, $access_token){

  $url = "https://api.weixin.qq.com/sns/userinfo?access_token=$access_token&openid=$openid&lang=zh_CN ";

    return json_decode($this->httpGet($url),true);

   //请求

  }

private function httpGet($url) {

  $curl = curl_init();

  curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);

  curl_setopt($curl, CURLOPT_TIMEOUT, 500);

  curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);

  curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false);

  curl_setopt($curl, CURLOPT_URL, $url);

  $res = curl_exec($curl);

  curl_close($curl);

  return $res;

 }

}

以上就是微信封装的调用微信签名包的类库的详细内容。


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:微信公众号会员卡领取功能实现分享
下一篇:微信小程序图文实例之分享效果详细解析
相关文章