WeChat に取り組んでいて、多くの落とし穴に遭遇しました。皆さんが寄り道しないように、今日はそれを書き留めました。少し乱暴な文章を書きました。わからないことがあれば、教えてください。 QQ1034100429 までご連絡いただくか、プライベートメッセージを送信してください。
getaccesstoken access_token を取得します
//支払いを開始します
パブリック関数 sendpay($openid, $title, $out_trade_no, $total_fee, $notify_url)
sendtpl はテンプレートメッセージを送信します<?php<br />
/**<br />
* PhpStorm によって作成されました。<br />
* ユーザー: 管理者<br />
* 日付: 2016/4/11<br />
* 時間: 22:43<br />
*/<br />
名前空間組織;<br />
クラスウェイシン<br />
{<br />
Private $appid; //WeChat公式アカウントのAppid<br />
Private $appsecret; //WeChat パブリック アカウントのアプリシークレット<br />
Private $mchid //WeChat パブリック アカウントの販売アカウント<br />
プライベート $wechatkey //WeChat 公式アカウントの支払いキー<br />
プライベート$トークン;<br />
パブリック関数 __construct()<br />
{<br />
$this->appid = C('WEIXIN_APPID');<br />
$this->appsecret = C("WEIXIN_APP_SECRET");<br>
$this->mchid = C("WEIXIN_MCHID");<br>
$this->wechatkey = C("WEIXIN_KEY");<br>
$this->token = C('WEIXIN_APP_TOKEN');<br>
<br>
}<br>
パブリック関数chushi()<br>
{<br>
echo $this->getaccesstoken();<br>
}<br>
パブリック関数 checkSignature()<br>
{<br>
$signature = $_GET['signature'];<br>
$timestamp = $_GET['timestamp'];<br>
$nonce = $_GET['nonce'];<br>
$token = $this->token;<br>
$arrtemp = array($token, $timestamp, $nonce);<br>
sort($arrtemp, SORT_STRING);<br>
$arrtemp = implode($arrtemp);<br>
$arrtemp = sha1($arrtemp);<br>
If ($arrtemp == $signature) {<br>
true を返します;<br>
else {<br>
false を返します。
}<br>
}<br>
パブリック関数 valid()<br>
{<br>
$echoStr = $_GET['echostr'];<br>
If ($this->checkSignature()) {<br>
エコー $echoStr;<br>
終了します;<br>
}<br>
}<br>
////返された情報に従って、対応する処理を行う<br>
// パブリック関数 responseMsg()<br>
// {<br>
// $postStr = file_get_contents('php://input');<br>
// if (!empty($postStr)){<br>
// /* libxml_disable_entity_loader は XML 外部エンティティの挿入を防ぐためのものです<br>
// 最善の方法は、xml の有効性を自分でチェックすることです */<br>
// libxml_disable_entity_loader(true);<br>
// $postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA);<br>// $fromUsername = $postObj->FromUserName;<br>
// $toUsername = $postObj->ToUserName;<br>
// $keyword = trim($postObj->Content);<br>
// $msgType = $postObj->MsgType;<br>
// $Event=$postObj->Event;<br>
// $time = time();<br>
// $textTpl = "<xml><br>
// <ToUserName><![CDATA[%s]]></ToUserName><br>
// <FromUserName><![CDATA[%s]]></FromUserName><br>
// <CreateTime>%s</CreateTime><br>
// <MsgType><![CDATA[%s]]></MsgType><br>
// <コンテンツ><![CDATA[%s]]></コンテンツ><br>
// <FuncFlag>0</FuncFlag><br>
// </xml>";<br>
// if(!empty( $keyword ))<br>
// {<br>
// $msgType = "テキスト";<br>
// $contentStr = "wechat ワールドへようこそ!";<br>
// $resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType, $contentStr);<br>
// echo $resultStr;<br>
// }その他{<br>
// echo 「何かを入力してください...」;<br>
// }<br>
//<br>
// }else {<br>
// エコー "";<br>
// 終了;<br>
// }<br>
// }<br>
パブリック関数getaccesstoken()<br>
{<br>
$access_token = S('access_token');<br>
if(!empty($access_token)){<br>
<br>
return $access_token;<br>
}その他{<br>
$url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=" . $this->appid 。 「&secret=」。 $this->appsecret;;<br>
$ret = $this->curlget($url);<br> $ret = json_decode($ret,true);<br>
S('アクセストークン',$ret['アクセストークン'],7100);<br>
<br>
return $ret['access_token'];<br>
}<br>
}<br>
//によるopenid拉取用户情報<br>
public function userinfo($openid){<br>
$access_token = $this->getaccesstoken();<br>
$url = "https://api.weixin.qq.com/cgi-bin/user/info?access_token=".$access_token."&openid=".$openid."&lang=zh_CN";<br>
$userinfo = json_decode($this->curlget($url),true);<br>
$userinfo を返す;<br>
}<br>
関数 p($arr){<br>
echo "<meta charset='utf8'><pre class="brush:php;toolbar:false">";<br>
print_r($arr);<br>
}<br>
関数curlget($url)<br>
{<br>
$ch = curl_init();<br>
curl_setopt($ch, CURLOPT_URL, $url);<br>
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);<br>
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);<br>
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);<br>
curl_setopt($ch, CURLOPT_HEADER, 0);<br>
$output = curl_exec($ch);<br>
curl_close($ch);<br>
return $output;<br>
}<br>
public function jingmo($url,$code,$state){<br>
if($code){<br>
$url = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=".$this->appid."&secret=".$this->appsecret."&code="。 $code."&grant_type=authorization_code";<br>
$arrtemp = json_decode($this->curlget($url),true);<br>
$ret = $this->getuserinfo($arrtemp['openid'],$arrtemp['access_token']);<br>
return $ret;<br>
}その他{<br>
$url = "https://open.weixin.qq.com/connect/oauth2/authorize?appid=".$this->appid."&redirect_uri=".$url."&response_type=code&scope=snsapi_userinfo&state=。 $state."#wechat_redirect";<br>
header("場所: $url");<br>
}<br>
}<br>
パブリック関数 getuserinfo($openid,$user_access_token){<br>
$userurl = "https://api.weixin.qq.com/sns/userinfo?access_token=".$user_access_token."&openid=".$openid."&lang=zh_CN";<br>
$userinfo = json_decode($this->curlget($userurl),true);<br>
$userinfo を返す;<br>
}<br>
パブリック関数 getjsapi_ticket(){<br>
$js_ticket = S("js_ticket");<br>
if(!empty($js_ticket)){<br>
return $js_ticket;<br>
}その他{<br> $access_token = $this->getaccesstoken();<br>
$url = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=".$access_token."&type=jsapi";<br>
$res = json_decode($this->curlget($url),true);<br>
S("js_ticket",$res['ticket'],7100);<br>
return $res['ticket'];<br>
}<br>
}<br>
パブリック関数 getjssign(){<br>
echo "<meta charset='utf8'>";<br>
$js_ticket = $this->getjsapi_ticket();<br>
$time = time();<br>
$arr = 配列(<br>
'noncestr'=>md5($time),<br>
'jsapi_ticket'=>$js_ticket,<br>
'タイムスタンプ'=>$time,<br>
'url'=>'http://'.$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'],<br>
<br>
);<br>
$this->p($arr);<br>
ksort($arr);<br>
$string="";<br>
$i=1;<br>
foreach($arr as $key=>$val){<br>
if($i==1){<br>
$string.=$key."=".$val;<br>
}その他{<br>
$string.="&".$key."=".$val;<br>
}<br>
$i++;<br>
echo $i;<br>
}<br>
// echo $string;<br>
$signature =strto lower($string);<br>
$signature = sha1($string);<br>
$jsconfig = array(<br>
'デバッグ'=>true,<br>
'appId'=>$this->appid,<br>
'タイムスタンプ'=>$time,<br>
'nonceStr'=>md5($time),<br>
'署名'=>$署名,<br>
' jsApiList'=>"['onMenuShareTimeline','onMenuShareAppMessage','onMenuShareQQ']",<br>
);<br>
$json = json_encode($jsconfig);<br>
$json を返す;<br>
}<br>
//生成大写签名<br>
function createsign($arr,$biaozhi){<br>
ksort($arr);<br>
$string="";<br>
$i=1;<br>
foreach($arr as $key=>$val){<br>
if($i==1){<br> $string.=$key."=".$val;<br>
}その他{<br>
$string.="&".$key."=".$val;<br>
}<br>
$i++;<br>
}<br>
$signtemp = 「$string&key=」。 $this->wechatkey;<br>
$sign = strtoupper(MD5($signtemp));<br>
$arr[$biaozhi] = $sign;<br>
//$json = json_encode($arr);<br>
$arr;<br>を返します
}<br>
//支付<br>
<br>
//発行支付<br>
public 関数 sendpay($openid, $title, $out_trade_no, $total_fee, $notify_url)<br>
{<br>
$time = time();<br>
$arr = 配列(<br>
'appid' => $this->アプリID、<br>
「mch_id」 => $this->mchid、<br>
'nonce_str' => md5($time)、<br>
「本体」=> 「kjhk」、<br>
'out_trade_no' => $out_trade_no、<br>
'total_fee' => $total_fee,<br>
「spbill_create_ip」 => "127.0.0.1"、<br>
「notify_url」 => $notify_url、<br>
'trade_type' => 「JSAPI」<br>
'openid' => $openid、<br>
);<br>
$biaozhi ='サイン';<br>
$arr = $this->createsign($arr,$biaozhi);<br>
$xml = "<xml>";<br>
foreach ($arr as $key=>$val) {<br>
$xml.="<".$key.">".$val."</".$key.">";<br>
}<br>
$xml.="</xml>";<br>
$url = "https://api.mch.weixin.qq.com/pay/unifiedorder";<br>
$resxml = $this->postCurlTransfer($url,$xml);<br>
$res = simplexml_load_string($resxml);<br>
$cutime = time();<br>
$jsapiarr=配列(<br>
'appId'=>$this->appid,<br>
'timeStamp'=>"$cutime",<br>
'nonceStr'=>md5($cutime),<br>
'package'=>"prepay_id=".$res->prepay_id,<br>
'signType'=>"MD5",<br>
);<br> $biaozhi = 'paySign';<br>
$jsapi = $this->createsign($jsapiarr,$biaozhi);<br>
// $jsapijson = json_encode($jsapi);<br>
$jsapi を返します;<br>
}<br>
パブリック関数 getpaysign(){<br>
$time = time();<br>
$arr = 配列(<br>
'appid'=>$this->appid,<br>
'mch_id'=>$this->mchid,<br>
'nonce_str'=>md5($time),<br>
'body'=>"sdf",<br>
'out_trade_no'=>"2016".$time,<br>
'total_fee'=>1,<br>
'spbill_create_ip'=>"127.0.0.1",<br>
'notify_url'=>"http://www.baidu.com",<br>
'trade_type'=>"JSAPI",<br>
);<br>
ksort($arr);<br>
$string="";<br>
$i=1;<br>
foreach($arr as $key=>$val){<br>
if($i==1){<br>
$string.=$key."=".$val;<br>
}その他{<br>
$string.="&".$key."=".$val;<br>
}<br>
$i++;<br>
}<br>
$string.="&key=".$this->wechatkey;<br>
$sign = strtoupper(md5($string));<br>
$arr['sign'] = $sign;<br>
$arr;<br>を返します
}<br>
関数Post($curlPost,$url){<br>
$curl = curl_init();<br>
curl_setopt($curl, CURLOPT_URL, $url);<br>
curl_setopt($curl, CURLOPT_HEADER, false);<br>
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);<br>
curl_setopt($curl, CURLOPT_NOBODY, true);<br>
curl_setopt($curl, CURLOPT_POST, true);<br>
curl_setopt($curl, CURLOPT_POSTFIELDS, $curlPost);<br>
$return_str = curl_exec($curl);<br>
curl_close($curl);<br>
return $return_str;<br>
}<br>
プライベート関数postCurlTransfer($url, $data)<br>
{<br>
$curl = curl_init();<br>
curl_setopt($curl, CURLOPT_URL, $url);<br>
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);<br>
curl_setopt($curl, CURLOPT_POST, 1);<br>
curl_setopt($curl, CURLOPT_POSTFIELDS, $data);<br>$str =curl_exec($curl);<br>
curl_close($curl);<br>
<br>
$ Str を返します。
}<br>
//テンプレートメッセージを送信<br>
パブリック関数 sendtpl($openid, $url, $template_id, $content, $topcolor="#FF0000")<br>
{<br>
$arr = array(<br>
'touser' => $openid,<br>
'template_id' => $template_id,<br>
'url' => $url,<br>
'topcolor' => $topcolor,<br>
「データ」 => $content,<br>
);<br>
$arrjson = json_encode($arr);<br>
$accesstoken = $this->getAccessToken();<br>
$sendurl = "https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=".$accesstoken;<br>
return $this->postCurlTransfer($sendurl, $arrjson);<br>
}<br>
}<br>上記はWeChat決済のシンプルなパッケージです</xml></xml>
決済を開始する場合は、まずWeChat公式アカウントの情報を対応させてください。
WeChat 支払いディレクトリを含む
私はここにいます
http://ドメイン名//index.php/Home/Index/
こんな感じです
access_token
を取得するプロセス
/**<br />
* PhpStorm によって作成されました。<br />
* ユーザー: sks<br />
* 日付: 16/7/8<br />
* 時間: 午後3時54分<br />
*/<br />
名前空間 HomeController;<br />
CommonControllerHomebaseController を使用します;<br />
WeixinController クラスは HomebaseController を拡張します{<br />
パブリック関数 zhanshi(){<br />
$weixin = 新しい OrgWeixin;<br />
$code = $_GET['code'];<br />
$state = $_GET['state'];<br />
$url="";<br />
$userinfo = $weixin->jingmo($url, $code, $state);<br>
セッション('ユーザー情報',$ユーザー情報);<br>
if($code) {<br>
header("場所: $state");<br>
}その他{<br>
}<br>
}<br>
}<br>公開関数
function.php<br>function getuserinfo(){ //ユーザー情報を取得します<code class="prettyprint linenums lang-php">
Import("weixin");<br>
$weixin = 新しい OrgWeixin;<br>
$info = session('userinfo');<br>
If($info){<br>
$ 情報を返します。
死ぬ; <br>
}その他{<br>
$state = 'http://' . $_SERVER['REQUEST_URI'] ;<br>
$code =
$url = 'http://' . $_SERVER['HTTP_HOST'] .U('Home/Weixin/zhanshi');<br>
$url = urlencode($url);<br>
$weixin->jingmo($url, $code, $state);<br>
}<br>
}<br>テスト支払い<br><?php<br />
/**
* PhpStorm によって作成されました。
*ユーザー: sks<br />
*日付:16/7/8<br />* 時間: 午後3時29分<br />
*/<br />
名前空間 HomeController;<br />
CommonControllerHomebaseController を使用します;<br />
ThinkPage を使用してください;<br />
クラス IndexController は HomebaseController を拡張します{<br />
<br />
//テスト支払い<br />
パブリック関数 zhifu()<br />
{<br />
$userinfo = getuserinfo() //WeChat ユーザー情報を取得し、パブリック関数を呼び出します <br />;
$openid = $userinfo['openid'];<br />
$time = time();<br />
$title = "支払いたい";<br />
$out_trade_no = date('Y',time()).$time.rand(1000,2000);<br />
$total_fee = 1;<br />
$notify_url = "http://ドメイン名/index.php/Home/Index/paynotify";//コールバック URL <br />
$weixin = 新しい OrgWeixin;<br />
$result = $weixin->sendpay($openid, $title, $out_trade_no, $total_fee, $notify_url);<br />
$this->assign('result',$result);<br />
$this->display();<br />
}<br />
//決済結果通知はこちら<br />
パブリック関数 paynotify(){<br />
$weixin = 新しい OrgWeixin;<br />
$xml = file_get_contents("php://input");<br />
$p = simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOCDATA);<br />
$arr = $this->object_array($p);<br />
$out_trade_no = $arr['out_trade_no'];<br />
$transaction_id= $arr['transaction_id'];<br />
$openid = $arr['openid'];<br />
$sign = $arr['sign'];<br />
//支払い結果を処理中<br />
unset($arr['sign']);<br />
$biaozhi = "サイン";<br />
$ret = $weixin->createsign($arr, $biaozhi);<br />
If($ret['sign'] === $sign) {<br />
$aa = "成功";<br />
else {<br />
$aa = "失敗";<br />
}<br />
$file = './logweixin.txt';//書き込むファイルのファイル名 (任意のファイル名で可)、ファイルが存在しない場合は作成されます<br />
$content = $out_trade_no."***".$transaction_id."最初に書き込まれたコンテンツ n";<br />
If($f = file_put_contents($file, $content,FILE_APPEND)){//この関数はバージョン (PHP 5) をサポートします<br />
echo "書き込みに成功しました。<br />";<br>
}<br>
//支払い結果の処理プロセスはこちら<br>
エコー「成功」;<br>
}<br>
<br>
パブリック関数 getaccesstoken(){<br>
$weixin = 新しい OrgWeixin;<br>
echo $weixin->getaccesstoken();<br>
<br>
}<br>
}