>  기사  >  php教程  >  2016년에 패키지된 위챗 결제는 사용하기 너무 쉽습니다

2016년에 패키지된 위챗 결제는 사용하기 너무 쉽습니다

WBOY
WBOY원래의
2016-08-04 08:56:201495검색

위챗을 하면서 많은 함정에 빠졌습니다. 모두가 우회하는 것을 피하기 위해 오늘 글을 쓰게 되었습니다. 조금 조잡한 내용이 있다면, 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 /> 비공개 $appid; //WeChat 공개 계정의 appid<br /> 비공개 $appsecret; //WeChat 공개 계정의 appsecret<br /> Private $mchid; // 위챗 공식 계정의 판매자 ID <br /> Private $wechatkey; //위챗 공식 계정 결제 키<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> }<br> 공개 함수 valid()<br> {<br>         $echoStr = $_GET['echostr'];<br>             if ($this->checkSignature()) {<br>                   echo $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 eXternal Entity 주입을 방지하기 위한 것입니다.<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]]></Content><br> //                          <FuncFlag>0</FuncFlag><br> //                           </xml>";<br> //            if(!empty( $keyword ))<br> //            {<br> //                $msgType = "text";<br> //                $contentStr = "위챗 세상에 오신 것을 환영합니다!";<br> //               $resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType, $contentStr);<br> //                echo $resultStr;<br> //            }그밖에{<br> //                에코 "무언가를 입력하세요...";<br> //            }<br> //<br> //        }else {<br> //            에코 "";<br> //            종료;<br> //        }<br> //    }<br>     공개 함수 getaccesstoken()<br>     {<br>         $access_token = S('access_token');<br>         if(!empty($access_token)){<br> <br>             $access_token 반환<br>         }그밖에{<br>             $url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=" . $this->appid . "&비밀=" . $this->appsecret;;<br>             $ret = $this->curlget($url);<br>            $ret = json_decode($ret,true);<br>             S('access_token',$ret['access_token'],7100);<br>     <br>             return $ret['access_token'];<br>         }<br>     }<br>     //根据openid拉取用户信息<br>     공개  기능 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>     함수 컬겟($url)<br>     {<br>         $ch = curl_init();<br>         컬_setopt($ch, CURLOPT_URL, $url);<br>         컬_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);<br>         컬_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);<br>         컬_setopt($ch, CURLOPT_RETURNTRANSFER, 1);<br>         컬_setopt($ch, CURLOPT_HEADER, 0);<br>         $output = curl_exec($ch);<br>         컬_닫기($ch);<br>         $output을 반환합니다.<br>     }<br>     공개 함수 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>             반환  $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>             $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>             $res['ticket'];<br> 반환         }<br>     }<br>     공개 함수 getjssign(){<br>         echo "<meta charset='utf8'>";<br>         $js_ticket = $this->getjsapi_ticket();<br>         $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>             에코 $i;<br>         }<br>         // 에코 $string;<br>         $signature =strtolower($string);<br>         $signature =  sha1($string);<br>         $jsconfig = 배열(<br>             '디버그'=>참,<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>     함수 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>     공개 함수 sendpay($openid, $title, $out_trade_no, $total_fee, $notify_url)<br>     {<br>         $time = 시간();<br>         $arr = 배열(<br>             '앱' => $this->appid,<br>             'mch_id' => $this->mchid<br>             'nonce_str' => md5($time),<br>             '본문' => "ㅋㅋㅋㅋ",<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>             '무역 유형' => "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 = 시간();<br>         $jsapiarr=배열(<br>             'appId'=>$this->appid,<br>             'timeStamp'=>"$cutime",<br>             'nonceStr'=>md5($cutime),<br>             '패키지'=>"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 = 시간();<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>     함수 포스트($curlPost,$url){<br>         $curl = curl_init();<br>         컬_setopt($curl, CURLOPT_URL, $url);<br>         컬_setopt($curl, CURLOPT_HEADER, false);<br>         cur_setopt($curl, CURLOPT_RETURNTRANSFER, true);<br>         curl_setopt($curl, CURLOPT_NOBODY, true);<br>         컬_setopt($curl, CURLOPT_POST, true);<br>         컬_setopt($curl, CURLOPT_POSTFIELDS, $curlPost);<br>         $return_str = curl_exec($curl);<br>         컬_닫기($curl);<br>         $return_str;<br> 반환     }<br>     비공개 함수 postCurlTransfer($url, $data)<br>     {<br>         $curl = curl_init();<br>         컬_setopt($curl, CURLOPT_URL, $url);<br>         컬_setopt($curl, CURLOPT_RETURNTRANSFER, 1);<br>         컬_setopt($curl, CURLOPT_POST, 1);<br>         컬_setopt($curl, CURLOPT_POSTFIELDS, $data);<br>         $str = 컬_exec($curl);<br>          컬_닫기($curl);<br> <br>          $str 반환<br> }<br> //템플릿 메시지 보내기<br> 공개 함수 sendtpl($openid, $url, $template_id, $content, $topcolor="#FF0000")<br> {<br>         $arr = 배열(<br>             'touser' => $openid,<br>             '템플릿_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> }위는 위챗 결제의 간단한 패키지입니다

결제를 시작하려면 먼저 WeChat 공식 계정의 정보와 일치하십시오.
WeChat 결제 디렉토리 포함

입니다 http://도메인 이름//index.php/Home/Index/
이런 것 같아요

access_token을 얻는 과정<?php<br /> /**<br /> * Created by PhpStorm.<br /> * User: sks<br /> * Date: 16/7/8<br /> * Time: 下午3:54<br /> */<br /> namespace HomeController;<br /> use CommonControllerHomebaseController;<br /> Class WeixinController extends HomebaseController{<br /> public function zhanshi(){<br /> $weixin = new OrgWeixin;<br /> $code = $_GET[&#039;code&#039;];<br /> $state = $_GET[&#039;state&#039;];<br /> $url="";<br /> $userinfo = $weixin->jingmo($url, $code, $state);<br>         session('userinfo',$userinfo);<br>         if($code) {<br>             header("Location: $state");<br>         }else{<br>         }<br>     }<br> } /**function getuserinfo(){ //获取用户信息<br /> import("weixin");<br /> $weixin = new OrgWeixin;<br /> $info = session(&#039;userinfo&#039;);<br /> if($info){<br /> return $info;<br /> die;<br /> }else {<br /> $state = &#039;http://&#039; . $_SERVER[&#039;HTTP_HOST&#039;] . $_SERVER[&#039;REQUEST_URI&#039;];<br /> $code = &#039;&#039;;<br /> $url = &#039;http://&#039; . $_SERVER[&#039;HTTP_HOST&#039;] . U(&#039;Home/Weixin/zhanshi&#039;);<br /> $url = urlencode($url);<br /> $weixin->jingmo($url, $code, $state);<br>     }<br> }  * PhpStorm이 만들었습니다.<code class="prettyprint linenums lang-php">  * 사용자: sks<br>  * 날짜: 16/7/8<br>  * 시간: 下午3:54<br>  */<br> 네임스페이스 HomeController;<br> CommonControllerHomebaseController를 사용하세요. 클래스 WeixinController는 HomebaseController를 확장합니다.{ 공개 함수 zhanshi(){         $weixin = 새로운 OrgWeixin; $code = $_GET['코드'];         $state = $_GET['state'];          $url=""; $userinfo = $weixin->jingmo($url, $code, $state); 세션('userinfo',$userinfo);            if($code) {              헤더("위치: $state");           }그 외{         } } }공개 행사 function.phpfunction getuserinfo(){ //사용자 정보 가져오기 Import("weixin"); $weixin = 새로운 OrgWeixin; $info = 세션('사용자 정보'); If($정보){           $정보 반환           죽다; }그밖에 { $state = 'http://' . $_SERVER['HTTP_HOST'] .          $code =                                                                $url = 'http://' . $_SERVER['HTTP_HOST'] . U('홈/Weixin/zhanshi'); $url = urlencode($url);          $weixin->jingmo($url, $code, $state); } }테스트 결제<?php<🎜> /**<🎜> *PhpStorm에서 제작했습니다.<🎜> * 사용자 : sks<🎜> * 일시 : 8/16/7<🎜>* 시간 : 오후 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 = 시간();<br /> ​​​​$title = "결제하고 싶어요";<br />          $out_trade_no = 날짜('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->할당('결과',$결과);<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> echo "성공";<br> }<br> <br> 공개 함수 getaccesstoken(){<br>         $weixin = 새로운 OrgWeixin;<br> echo $weixin->getaccesstoken();<br> <br> }<br> }

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.