<?php
class
WxApi {
const
appId =
""
;
const
appSecret =
""
;
public
$parameters
=
array
();
public
function
__construct(){
}
public
function
wxHttpsRequest(
$url
,
$data
= null){
$curl
= curl_init();
curl_setopt(
$curl
, CURLOPT_URL,
$url
);
curl_setopt(
$curl
, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt(
$curl
, CURLOPT_SSL_VERIFYHOST, FALSE);
if
(!
empty
(
$data
)){
curl_setopt(
$curl
, CURLOPT_POST, 1);
curl_setopt(
$curl
, CURLOPT_POSTFIELDS,
$data
);
}
curl_setopt(
$curl
, CURLOPT_RETURNTRANSFER, 1);
$output
= curl_exec(
$curl
);
curl_close(
$curl
);
return
$output
;
}
public
function
wxHttpsRequestPem(
$url
,
$vars
,
$second
=30,
$aHeader
=
array
()){
$ch
= curl_init();
curl_setopt(
$ch
,CURLOPT_TIMEOUT,
$second
);
curl_setopt(
$ch
,CURLOPT_RETURNTRANSFER, 1);
curl_setopt(
$ch
,CURLOPT_URL,
$url
);
curl_setopt(
$ch
,CURLOPT_SSL_VERIFYPEER,false);
curl_setopt(
$ch
,CURLOPT_SSL_VERIFYHOST,false);
curl_setopt(
$ch
,CURLOPT_SSLCERTTYPE,
'PEM'
);
curl_setopt(
$ch
,CURLOPT_SSLCERT,
getcwd
().
'/apiclient_cert.pem'
);
curl_setopt(
$ch
,CURLOPT_SSLKEYTYPE,
'PEM'
);
curl_setopt(
$ch
,CURLOPT_SSLKEY,
getcwd
().
'/apiclient_key.pem'
);
curl_setopt(
$ch
,CURLOPT_CAINFO,
'PEM'
);
curl_setopt(
$ch
,CURLOPT_CAINFO,
getcwd
().
'/rootca.pem'
);
if
(
count
(
$aHeader
) >= 1 ){
curl_setopt(
$ch
, CURLOPT_HTTPHEADER,
$aHeader
);
}
curl_setopt(
$ch
,CURLOPT_POST, 1);
curl_setopt(
$ch
,CURLOPT_POSTFIELDS,
$vars
);
$data
= curl_exec(
$ch
);
if
(
$data
){
curl_close(
$ch
);
return
$data
;
}
else
{
$error
= curl_errno(
$ch
);
echo
"call faild, errorCode:$error\n"
;
curl_close(
$ch
);
return
false;
}
}
public
function
wxAccessToken(
$appId
= NULL ,
$appSecret
= NULL){
$appId
=
is_null
(
$appId
) ? self::appId :
$appId
;
$appSecret
=
is_null
(
$appSecret
) ? self::appSecret :
$appSecret
;
$data
= json_decode(
file_get_contents
(
"access_token.json"
));
if
(
$data
->expire_time < time()) {
$url
=
"https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid="
.
$appId
.
"&secret="
.
$appSecret
;
$result
=
$this
->wxHttpsRequest(
$url
);
$jsoninfo
= json_decode(
$result
, true);
$access_token
=
$jsoninfo
[
"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
;
}
public
function
wxJsApiTicket(
$appId
= NULL ,
$appSecret
= NULL){
$appId
=
is_null
(
$appId
) ? self::appId :
$appId
;
$appSecret
=
is_null
(
$appSecret
) ? self::appSecret :
$appSecret
;
$data
= json_decode(
file_get_contents
(
"jsapi_ticket.json"
));
if
(
$data
->expire_time < time()) {
$url
=
"https://api.weixin.qq.com/cgi-bin/ticket/getticket?type=jsapi&access_token="
.
$this
->wxAccessToken();
$result
=
$this
->wxHttpsRequest(
$url
);
$jsoninfo
= json_decode(
$result
, true);
$ticket
=
$jsoninfo
[
'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
;
}
public
function
wxGetUser(
$openId
){
$wxAccessToken
=
$this
->wxAccessToken();
$url
=
"https://api.weixin.qq.com/cgi-bin/user/info?access_token="
.
$wxAccessToken
.
"&openid="
.
$openId
.
"&lang=zh_CN"
;
$result
=
$this
->wxHttpsRequest(
$url
);
$jsoninfo
= json_decode(
$result
, true);
return
$jsoninfo
;
}
public
function
wxQrCodeTicket(
$jsonData
){
$wxAccessToken
=
$this
->wxAccessToken();
$url
=
"https://api.weixin.qq.com/cgi-bin/qrcode/create?access_token="
.
$wxAccessToken
;
$result
=
$this
->wxHttpsRequest(
$url
,
$jsonData
);
return
$result
;
}
public
function
wxQrCode(
$ticket
){
$url
=
"https://mp.weixin.qq.com/cgi-bin/showqrcode?ticket="
. urlencode(
$ticket
);
return
$url
;
}
public
function
wxSetSend(
$touser
,
$template_id
,
$url
,
$data
,
$topcolor
=
'#7B68EE'
){
$template
=
array
(
'touser'
=>
$touser
,
'template_id'
=>
$template_id
,
'url'
=>
$url
,
'topcolor'
=>
$topcolor
,
'data'
=>
$data
);
$jsonData
= json_encode(
$template
);
$result
=
$this
->wxSendTemplate(
$jsonData
);
return
$result
;
}
public
function
wxOauthBase(
$redirectUrl
,
$state
=
""
,
$appId
= NULL){
$appId
=
is_null
(
$appId
) ? self::appId :
$appId
;
$url
=
"https://open.weixin.qq.com/connect/oauth2/authorize?appid="
.
$appId
.
"&redirect_uri="
.
$redirectUrl
.
"&response_type=code&scope=snsapi_base&state="
.
$state
.
"#wechat_redirect"
;
return
$url
;
}
public
function
wxOauthUserinfo(
$redirectUrl
,
$state
=
""
,
$appId
= NULL){
$appId
=
is_null
(
$appId
) ? self::appId :
$appId
;
$url
=
"https://open.weixin.qq.com/connect/oauth2/authorize?appid="
.
$appId
.
"&redirect_uri="
.
$redirectUrl
.
"&response_type=code&scope=snsapi_userinfo&state="
.
$state
.
"#wechat_redirect"
;
return
$url
;
}
public
function
wxHeader(
$url
){
header(
"location:"
.
$url
);
}
public
function
wxOauthAccessToken(
$code
,
$appId
= NULL ,
$appSecret
= NULL){
$appId
=
is_null
(
$appId
) ? self::appId :
$appId
;
$appSecret
=
is_null
(
$appSecret
) ? self::appSecret :
$appSecret
;
$url
=
"https://api.weixin.qq.com/sns/oauth2/access_token?appid="
.
$appId
.
"&secret="
.
$appSecret
.
"&code="
.
$code
.
"&grant_type=authorization_code"
;
$result
=
$this
->wxHttpsRequest(
$url
);
$jsoninfo
= json_decode(
$result
, true);
return
$jsoninfo
;
}
public
function
wxOauthUser(
$OauthAT
,
$openId
){
$url
=
"https://api.weixin.qq.com/sns/userinfo?access_token="
.
$OauthAT
.
"&openid="
.
$openId
.
"&lang=zh_CN"
;
$result
=
$this
->wxHttpsRequest(
$url
);
$jsoninfo
= json_decode(
$result
, true);
return
$jsoninfo
;
}
public
function
wxMenuCreate(
$jsonData
){
$wxAccessToken
=
$this
->wxAccessToken();
$url
=
"https://api.weixin.qq.com/cgi-bin/menu/create?access_token="
.
$wxAccessToken
;
$result
=
$this
->wxHttpsRequest(
$url
,
$jsonData
);
$jsoninfo
= json_decode(
$result
, true);
return
$jsoninfo
;
}
public
function
wxMenuGet(){
$wxAccessToken
=
$this
->wxAccessToken();
$url
=
"https://api.weixin.qq.com/cgi-bin/menu/get?access_token="
.
$wxAccessToken
;
$result
=
$this
->wxHttpsRequest(
$url
);
$jsoninfo
= json_decode(
$result
, true);
return
$jsoninfo
;
}
public
function
wxMenuDelete(){
$wxAccessToken
=
$this
->wxAccessToken();
$url
=
"https://api.weixin.qq.com/cgi-bin/menu/delete?access_token="
.
$wxAccessToken
;
$result
=
$this
->wxHttpsRequest(
$url
);
$jsoninfo
= json_decode(
$result
, true);
return
$jsoninfo
;
}
public
function
wxMenuGetInfo(){
$wxAccessToken
=
$this
->wxAccessToken();
$url
=
"https://api.weixin.qq.com/cgi-bin/get_current_selfmenu_info?access_token="
.
$wxAccessToken
;
$result
=
$this
->wxHttpsRequest(
$url
);
$jsoninfo
= json_decode(
$result
, true);
return
$jsoninfo
;
}
public
function
wxNonceStr(
$length
= 16,
$type
= FALSE) {
$chars
=
"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
;
$str
=
""
;
for
(
$i
= 0;
$i
<
$length
;
$i
++) {
$str
.=
substr
(
$chars
, mt_rand(0,
strlen
(
$chars
) - 1), 1);
}
if
(
$type
== TRUE){
return
strtoupper
(md5(time() .
$str
));
}
else
{
return
$str
;
}
}
public
function
wxMchBillno(
$mchid
= NULL) {
if
(
is_null
(
$mchid
)){
if
(self::mchid ==
""
||
is_null
(self::mchid)){
$mchid
= time();
}
else
{
$mchid
= self::mchid;
}
}
else
{
$mchid
=
substr
(
addslashes
(
$mchid
),0,10);
}
return
date
(
"Ymd"
,time()).time().
$mchid
;
}
public
function
wxSetParam(
$parameters
){
if
(
is_array
(
$parameters
) && !
empty
(
$parameters
)){
$this
->parameters =
$parameters
;
return
$this
->parameters;
}
else
{
return
array
();
}
}
public
function
wxFormatArray(
$parameters
= NULL,
$urlencode
= FALSE){
if
(
is_null
(
$parameters
)){
$parameters
=
$this
->parameters;
}
$restr
=
""
;
ksort(
$parameters
);
foreach
(
$parameters
as
$k
=>
$v
){
if
(null !=
$v
&&
"null"
!=
$v
&&
"sign"
!=
$k
) {
if
(
$urlencode
){
$v
= urlencode(
$v
);
}
$restr
.=
$k
.
"="
.
$v
.
"&"
;
}
}
if
(
strlen
(
$restr
) > 0) {
$restr
=
substr
(
$restr
, 0,
strlen
(
$restr
)-1);
}
return
$restr
;
}
public
function
wxMd5Sign(
$content
,
$privatekey
){
try
{
if
(
is_null
(
$privatekey
)) {
throw
new
Exception(
"财付通签名key不能为空!"
);
}
if
(
is_null
(
$content
)) {
throw
new
Exception(
"财付通签名内容不能为空"
);
}
$signStr
=
$content
.
"&key="
.
$privatekey
;
return
strtoupper
(md5(
$signStr
));
}
catch
(Exception
$e
)
{
die
(
$e
->getMessage());
}
}
public
function
wxSha1Sign(
$content
){
try
{
if
(
is_null
(
$content
)) {
throw
new
Exception(
"签名内容不能为空"
);
}
return
sha1(
$content
);
}
catch
(Exception
$e
)
{
die
(
$e
->getMessage());
}
}
public
function
wxJsapiPackage(){
$jsapi_ticket
=
$this
->wxJsApiTicket();
$protocol
= (!
empty
(
$_SERVER
[
'HTTPS'
]) &&
$_SERVER
[
'HTTPS'
] !==
'off'
||
$_SERVER
[
'SERVER_PORT'
] == 443) ?
"https://"
:
"http://"
;
$url
=
$protocol
.
$_SERVER
[
"HTTP_HOST"
].
$_SERVER
[
"REQUEST_URI"
];
$timestamp
= time();
$nonceStr
=
$this
->wxNonceStr();
$signPackage
=
array
(
"jsapi_ticket"
=>
$jsapi_ticket
,
"nonceStr"
=>
$nonceStr
,
"timestamp"
=>
$timestamp
,
"url"
=>
$url
);
$rawString
=
"jsapi_ticket=$jsapi_ticket&noncestr=$nonceStr×tamp=$timestamp&url=$url"
;
$signature
=
$this
->wxSha1Sign(
$rawString
);
$signPackage
[
'signature'
] =
$signature
;
$signPackage
[
'rawString'
] =
$rawString
;
$signPackage
[
'appId'
] = self::appId;
return
$signPackage
;
}
public
function
wxArrayToXml(
$parameters
= NULL){
if
(
is_null
(
$parameters
)){
$parameters
=
$this
->parameters;
}
if
(!
is_array
(
$parameters
) ||
empty
(
$parameters
)){
die
(
"参数不为数组无法解析"
);
}
$xml
=
"<xml>"
;
foreach
(
$arr
as
$key
=>
$val
)
{
if
(
is_numeric
(
$val
))
{
$xml
.=
"<"
.
$key
.
">"
.
$val
.
"</"
.
$key
.
">"
;
}
else
$xml
.=
"<"
.
$key
.
"><![CDATA["
.
$val
.
"]]></"
.
$key
.
">"
;
}
$xml
.=
"</xml>"
;
return
$xml
;
}
public
function
wxCardUpdateImg() {
$wxAccessToken
=
$this
->wxAccessToken();
$data
[
'buffer'
] =
'@D:\\workspace\\htdocs\\yky_test\\logo.jpg'
;
$url
=
"https://api.weixin.qq.com/cgi-bin/media/uploadimg?access_token="
.
$wxAccessToken
;
$result
=
$this
->wxHttpsRequest(
$url
,
$data
);
$jsoninfo
= json_decode(
$result
, true);
return
$jsoninfo
;
}
public
function
wxCardColor(){
$wxAccessToken
=
$this
->wxAccessToken();
$url
=
"https://api.weixin.qq.com/card/getcolors?access_token="
.
$wxAccessToken
;
$result
=
$this
->wxHttpsRequest(
$url
);
$jsoninfo
= json_decode(
$result
, true);
return
$jsoninfo
;
}
public
function
wxCardCreated(
$jsonData
) {
$wxAccessToken
=
$this
->wxAccessToken();
$url
=
"https://api.weixin.qq.com/card/create?access_token="
.
$wxAccessToken
;
$result
=
$this
->wxHttpsRequest(
$url
,
$jsonData
);
$jsoninfo
= json_decode(
$result
, true);
return
$jsoninfo
;
}
public
function
wxCardPackage(
$cardId
){
$timestamp
= time();
$api_ticket
=
$this
->wxJsApiTicket();
$cardId
=
$cardId
;
$arrays
=
array
(
$api_ticket
,
$timestamp
,
$cardId
);
sort(
$arrays
);
$string
= sha1(implode(
""
,
$arrays
));
$resultArray
[
'card_id'
] =
$cardId
;
$resultArray
[
'card_ext'
] =
array
();
$resultArray
[
'card_ext'
][
'openid'
] =
'oOmn4s9MiwqHSNNvPn0dBtU23toA'
;
$resultArray
[
'card_ext'
][
'timestamp'
] =
$timestamp
;
$resultArray
[
'card_ext'
][
'signature'
] =
$string
;
return
$resultArray
;
}
}