ホームページ  >  記事  >  php教程  >  2016 年にパッケージ化された WeChat 決済はとても使いやすいです

2016 年にパッケージ化された WeChat 決済はとても使いやすいです

WBOY
WBOYオリジナル
2016-08-04 08:56:201490ブラウズ

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> }

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。