위챗을 하면서 많은 함정에 빠졌습니다. 모두가 우회하는 것을 피하기 위해 오늘 글을 쓰게 되었습니다. 조금 조잡한 내용이 있다면, 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['code'];<br />
$state = $_GET['state'];<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('userinfo');<br />
if($info){<br />
return $info;<br />
die;<br />
}else {<br />
$state = 'http://' . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];<br />
$code = '';<br />
$url = 'http://' . $_SERVER['HTTP_HOST'] . U('Home/Weixin/zhanshi');<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>
}