{"id":29679,"date":"2024-11-25T16:38:47","date_gmt":"2024-11-25T08:38:47","guid":{"rendered":"https:\/\/fwq.ai\/blog\/29679\/"},"modified":"2024-11-25T16:38:47","modified_gmt":"2024-11-25T08:38:47","slug":"yii2-0%e5%ae%9e%e7%8e%b0%e5%be%ae%e4%bf%a1%e5%85%ac%e4%bc%97%e5%8f%b7%e5%90%8e%e5%8f%b0%e5%bc%80%e5%8f%91","status":"publish","type":"post","link":"https:\/\/fwq.ai\/blog\/29679\/","title":{"rendered":"Yii2.0\u5b9e\u73b0\u5fae\u4fe1\u516c\u4f17\u53f7\u540e\u53f0\u5f00\u53d1"},"content":{"rendered":"<p>\u672c\u6587\u5185\u5bb9\u8f83\u591a\uff0c\u5305\u62ec\u5fae\u4fe1\u63a5\u5165\u3001\u83b7\u53d6\u5fae\u4fe1\u7528\u6237\u4fe1\u606f\u3001\u5fae\u4fe1\u652f\u4ed8\u3001JSSDK\u914d\u7f6e\u53c2\u6570\u83b7\u53d6\u7b49\u90e8\u5206\u3002\u5982\u679c\u8bfb\u8005\u5bf9\u5fae\u4fe1\u5f00\u53d1\u6ca1\u6709\u4e00\u4e2a\u4e3b\u89c2\u4e0a\u7684\u8ba4\u8bc6\uff0c\u90a3\u4e48\u5efa\u8bae\u8bfb\u8005\u5148\u7814\u8bfb  \uff0c\u7136\u540e\u518d\u9605\u8bfb\u672c\u6587\uff0c\u6548\u679c\u66f4\u4f73\uff01\u53e6\u5916\u672c\u6587\u7684\u5206\u7ae0\u8282\u7248\u672c\u53ef\u4ee5\u5728 \u516b\u5b9d\u7ca5\u7684\u535a\u5ba2 \u627e\u5230\u3002<\/p>\n<h2>\u63a5\u5165\u5fae\u4fe1<\/h2>\n<h4>Yii2\u540e\u53f0\u914d\u7f6e<\/h4>\n<p>1.\u5728app\/config\/params.php\u4e2d\u914d\u7f6etoken\u53c2\u6570<\/p>\n<pre>return&nbsp;[\r\n&nbsp;&nbsp;&nbsp;&nbsp;\/\/\u5fae\u4fe1\u63a5\u5165\r\n&nbsp;&nbsp;&nbsp;&nbsp;'wechat'&nbsp;=&amp;gt;[\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'token'&nbsp;=&amp;gt;&nbsp;'your&nbsp;token',\r\n&nbsp;&nbsp;&nbsp;&nbsp;],\r\n];<\/pre>\n<p> \u767b\u5f55\u540e\u590d\u5236 <\/p>\n<p>2.\u5728app\/config\/main.php\u4e2d\u914d\u7f6e<\/p>\n<p>\u56e0\u4e3a\u63a5\u53e3\u6a21\u5757\u4f7f\u7528\u7684RESTful \uff0c\u6240\u4ee5\u9700\u8981\u89c4\u5219\u3002<\/p>\n<pre>'urlManager'&nbsp;=&amp;gt;&nbsp;[\r\n&nbsp;&nbsp;&nbsp;&nbsp;'enablePrettyUrl'&nbsp;=&amp;gt;&nbsp;true,\r\n&nbsp;&nbsp;&nbsp;&nbsp;'enableStrictParsing'&nbsp;=&amp;gt;&nbsp;true,\r\n&nbsp;&nbsp;&nbsp;&nbsp;'showScriptName'&nbsp;=&amp;gt;&nbsp;false,\r\n&nbsp;&nbsp;&nbsp;&nbsp;'rules'&nbsp;=&amp;gt;&nbsp;[\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'class'&nbsp;=&amp;gt;&nbsp;'yii\restUrlRule',\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'controller'&nbsp;=&amp;gt;&nbsp;'wechat',\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'extraPatterns'&nbsp;=&amp;gt;&nbsp;[\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'GET&nbsp;valid'&nbsp;=&amp;gt;&nbsp;'valid',\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;],\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;],\r\n&nbsp;&nbsp;&nbsp;&nbsp;],\r\n],<\/pre>\n<p> \u767b\u5f55\u540e\u590d\u5236 <\/p>\n<p>3.\u5728app\/controllers\u4e2d\u65b0\u5efaWechatController<\/p>\n<pre>&lt;?php namespace apicontrollers;\r\n\r\nuse Yii;\r\nuse yii\restActiveController;\r\n\r\nclass WechatController extends ActiveController\r\n{\r\n\r\n    public $modelClass = &#039;&#039;;\r\n\r\n    public function actionValid()\r\n    {\r\n        $echoStr = $_GET[\"echostr\"];\r\n        $signature = $_GET[\"signature\"];\r\n        $timestamp = $_GET[\"timestamp\"];\r\n        $nonce = $_GET[\"nonce\"];\r\n        \/\/valid signature , option\r\n        if($this-&gt;checkSignature($signature,$timestamp,$nonce)){\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;echo&nbsp;$echoStr;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}\r\n&nbsp;&nbsp;&nbsp;&nbsp;}\r\n\r\n&nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;function&nbsp;checkSignature($signature,$timestamp,$nonce)\r\n&nbsp;&nbsp;&nbsp;&nbsp;{\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\/\/&nbsp;you&nbsp;must&nbsp;define&nbsp;TOKEN&nbsp;by&nbsp;yourself\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$token&nbsp;=&nbsp;Yii::$app-&amp;gt;params['wechat']['token'];\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(!$token)&nbsp;{\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;echo&nbsp;'TOKEN&nbsp;is&nbsp;not&nbsp;defined!';\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;else&nbsp;{\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$tmpArr&nbsp;=&nbsp;array($token,&nbsp;$timestamp,&nbsp;$nonce);\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\/\/&nbsp;use&nbsp;SORT_STRING&nbsp;rule\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sort($tmpArr,&nbsp;SORT_STRING);\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$tmpStr&nbsp;=&nbsp;implode(&nbsp;$tmpArr&nbsp;);\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$tmpStr&nbsp;=&nbsp;sha1(&nbsp;$tmpStr&nbsp;);\r\n\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(&nbsp;$tmpStr&nbsp;==&nbsp;$signature&nbsp;){\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;true;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}else{\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;false;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}\r\n&nbsp;&nbsp;&nbsp;&nbsp;}\r\n\r\n}<\/pre>\n<p> \u767b\u5f55\u540e\u590d\u5236 <\/p>\n<h4>\u5fae\u4fe1\u516c\u4f17\u53f7\u540e\u53f0\u914d\u7f6e<\/h4>\n<p>\u5728\u5fae\u4fe1\u516c\u4f17\u53f7\u540e\u53f0\u914d\u7f6eURL\u548cToken\uff0c\u7136\u540e\u63d0\u4ea4\u9a8c\u8bc1\u5373\u53ef\u3002<\/p>\n<pre>URL:http:\/\/app.demo.com\/wechats\/valid\r\nToken:your token<\/pre>\n<p> \u767b\u5f55\u540e\u590d\u5236 <\/p>\n<h2>\u83b7\u53d6\u7528\u6237\u4fe1\u606f<\/h2>\n<h4>\u7528\u6237\u8868\u8bbe\u8ba1<\/h4>\n<pre>CREATE&nbsp;TABLE&nbsp;`wechat_user`&nbsp;(\r\n&nbsp;&nbsp;`id`&nbsp;int(11)&nbsp;NOT&nbsp;NULL,\r\n&nbsp;&nbsp;`openid`&nbsp;varchar(255)&nbsp;COLLATE&nbsp;utf8_unicode_ci&nbsp;NOT&nbsp;NULL,\r\n&nbsp;&nbsp;`nickname`&nbsp;varchar(50)&nbsp;COLLATE&nbsp;utf8_unicode_ci&nbsp;NOT&nbsp;NULL&nbsp;COMMENT&nbsp;'\u5fae\u4fe1\u6635\u79f0',\r\n&nbsp;&nbsp;`sex`&nbsp;tinyint(4)&nbsp;NOT&nbsp;NULL&nbsp;COMMENT&nbsp;'\u6027\u522b',\r\n&nbsp;&nbsp;`headimgurl`&nbsp;varchar(255)&nbsp;COLLATE&nbsp;utf8_unicode_ci&nbsp;NOT&nbsp;NULL&nbsp;COMMENT&nbsp;'\u5934\u50cf',\r\n&nbsp;&nbsp;`country`&nbsp;varchar(50)&nbsp;COLLATE&nbsp;utf8_unicode_ci&nbsp;NOT&nbsp;NULL&nbsp;COMMENT&nbsp;'\u56fd\u5bb6',\r\n&nbsp;&nbsp;`province`&nbsp;varchar(50)&nbsp;COLLATE&nbsp;utf8_unicode_ci&nbsp;NOT&nbsp;NULL&nbsp;COMMENT&nbsp;'\u7701\u4efd',\r\n&nbsp;&nbsp;`city`&nbsp;varchar(50)&nbsp;COLLATE&nbsp;utf8_unicode_ci&nbsp;NOT&nbsp;NULL&nbsp;COMMENT&nbsp;'\u57ce\u5e02',\r\n&nbsp;&nbsp;`access_token`&nbsp;varchar(255)&nbsp;COLLATE&nbsp;utf8_unicode_ci&nbsp;NOT&nbsp;NULL,\r\n&nbsp;&nbsp;`refresh_token`&nbsp;varchar(255)&nbsp;COLLATE&nbsp;utf8_unicode_ci&nbsp;NOT&nbsp;NULL,\r\n&nbsp;&nbsp;`created_at`&nbsp;timestamp&nbsp;NULL&nbsp;DEFAULT&nbsp;CURRENT_TIMESTAMP\r\n)&nbsp;ENGINE=InnoDB&nbsp;AUTO_INCREMENT=4&nbsp;DEFAULT&nbsp;CHARSET=utf8&nbsp;COLLATE=utf8_unicode_ci;\r\n\r\nALTER&nbsp;TABLE&nbsp;`wechat_user`\r\n&nbsp;&nbsp;ADD&nbsp;PRIMARY&nbsp;KEY&nbsp;(`id`);<\/pre>\n<p> \u767b\u5f55\u540e\u590d\u5236 <\/p>\n<h4>\u83b7\u53d6\u7528\u6237\u4fe1\u606f\u7684\u76f8\u5173\u63a5\u53e3<\/h4>\n<p>1.\u7528\u6237\u6388\u6743\u63a5\u53e3\uff1a\u83b7\u53d6access_token\u3001openid\u7b49\uff1b\u83b7\u53d6\u5e76\u4fdd\u5b58\u7528\u6237\u8d44\u6599\u5230\u6570\u636e\u5e93<\/p>\n<pre>public&nbsp;function&nbsp;actionAccesstoken()\r\n{\r\n&nbsp;&nbsp;&nbsp;&nbsp;$code&nbsp;=&nbsp;$_GET[\"code\"];\r\n&nbsp;&nbsp;&nbsp;&nbsp;$state&nbsp;=&nbsp;$_GET[\"state\"];\r\n&nbsp;&nbsp;&nbsp;&nbsp;$appid&nbsp;=&nbsp;Yii::$app-&amp;gt;params['wechat']['appid'];\r\n&nbsp;&nbsp;&nbsp;&nbsp;$appsecret&nbsp;=&nbsp;Yii::$app-&amp;gt;params['wechat']['appsecret'];\r\n&nbsp;&nbsp;&nbsp;&nbsp;$request_url&nbsp;=&nbsp;'https:\/\/api.weixin.qq.com\/sns\/oauth2\/access_token?appid='.$appid.'&amp;amp;secret='.$appsecret.'&amp;amp;code='.$code.'&amp;amp;grant_type=authorization_code';\r\n\r\n&nbsp;&nbsp;&nbsp;&nbsp;\/\/\u521d\u59cb\u5316\u4e00\u4e2acurl\u4f1a\u8bdd\r\n&nbsp;&nbsp;&nbsp;&nbsp;$ch&nbsp;=&nbsp;curl_init();\r\n&nbsp;&nbsp;&nbsp;&nbsp;curl_setopt($ch,&nbsp;CURLOPT_URL,&nbsp;$request_url);\r\n&nbsp;&nbsp;&nbsp;&nbsp;curl_setopt($ch,&nbsp;CURLOPT_RETURNTRANSFER,&nbsp;true);\r\n&nbsp;&nbsp;&nbsp;&nbsp;$result&nbsp;=&nbsp;curl_exec($ch);\r\n&nbsp;&nbsp;&nbsp;&nbsp;curl_close($ch);\r\n&nbsp;&nbsp;&nbsp;&nbsp;$result&nbsp;=&nbsp;$this-&amp;gt;response($result);\r\n\r\n&nbsp;&nbsp;&nbsp;&nbsp;\/\/\u83b7\u53d6token\u548copenid\u6210\u529f\uff0c\u6570\u636e\u89e3\u6790\r\n&nbsp;&nbsp;&nbsp;&nbsp;$access_token&nbsp;=&nbsp;$result['access_token'];\r\n&nbsp;&nbsp;&nbsp;&nbsp;$refresh_token&nbsp;=&nbsp;$result['refresh_token'];\r\n&nbsp;&nbsp;&nbsp;&nbsp;$openid&nbsp;=&nbsp;$result['openid'];\r\n\r\n&nbsp;&nbsp;&nbsp;&nbsp;\/\/\u8bf7\u6c42\u5fae\u4fe1\u63a5\u53e3\uff0c\u83b7\u53d6\u7528\u6237\u4fe1\u606f\r\n&nbsp;&nbsp;&nbsp;&nbsp;$userInfo&nbsp;=&nbsp;$this-&amp;gt;getUserInfo($access_token,$openid);\r\n&nbsp;&nbsp;&nbsp;&nbsp;$user_check&nbsp;=&nbsp;WechatUser::find()-&amp;gt;where(['openid'=&amp;gt;$openid])-&amp;gt;one();\r\n&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;($user_check)&nbsp;{\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\/\/\u66f4\u65b0\u7528\u6237\u8d44\u6599\r\n&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;else&nbsp;{\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\/\/\u4fdd\u5b58\u7528\u6237\u8d44\u6599\r\n&nbsp;&nbsp;&nbsp;&nbsp;}\r\n\r\n&nbsp;&nbsp;&nbsp;&nbsp;\/\/\u524d\u7aef\u7f51\u9875\u7684\u91cd\u5b9a\u5411\r\n&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;($openid)&nbsp;{\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;$this-&amp;gt;redirect($state.$openid);\r\n&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;else&nbsp;{\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;$this-&amp;gt;redirect($state);\r\n&nbsp;&nbsp;&nbsp;&nbsp;}\r\n}<\/pre>\n<p> \u767b\u5f55\u540e\u590d\u5236 <\/p>\n<p>2.\u4ece\u5fae\u4fe1\u83b7\u53d6\u7528\u6237\u8d44\u6599<\/p>\n<pre>public&nbsp;function&nbsp;getUserInfo($access_token,$openid)\r\n{\r\n&nbsp;&nbsp;&nbsp;&nbsp;$request_url&nbsp;=&nbsp;'https:\/\/api.weixin.qq.com\/sns\/userinfo?access_token='.$access_token.'&amp;amp;openid='.$openid.'&amp;amp;lang=zh_CN';\r\n&nbsp;&nbsp;&nbsp;&nbsp;\/\/\u521d\u59cb\u5316\u4e00\u4e2acurl\u4f1a\u8bdd\r\n&nbsp;&nbsp;&nbsp;&nbsp;$ch&nbsp;=&nbsp;curl_init();\r\n&nbsp;&nbsp;&nbsp;&nbsp;curl_setopt($ch,&nbsp;CURLOPT_URL,&nbsp;$request_url);\r\n&nbsp;&nbsp;&nbsp;&nbsp;curl_setopt($ch,&nbsp;CURLOPT_RETURNTRANSFER,&nbsp;true);\r\n&nbsp;&nbsp;&nbsp;&nbsp;$result&nbsp;=&nbsp;curl_exec($ch);\r\n&nbsp;&nbsp;&nbsp;&nbsp;curl_close($ch);\r\n&nbsp;&nbsp;&nbsp;&nbsp;$result&nbsp;=&nbsp;$this-&amp;gt;response($result);\r\n&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;$result;\r\n}<\/pre>\n<p> \u767b\u5f55\u540e\u590d\u5236 <\/p>\n<p>3.\u83b7\u53d6\u7528\u6237\u8d44\u6599\u63a5\u53e3<\/p>\n<pre>public&nbsp;function&nbsp;actionUserinfo()\r\n{\r\n&nbsp;&nbsp;&nbsp;&nbsp;if(isset($_REQUEST[\"openid\"])){\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$openid&nbsp;=&nbsp;$_REQUEST[\"openid\"];\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$user&nbsp;=&nbsp;WechatUser::find()-&amp;gt;where(['openid'=&amp;gt;$openid])-&amp;gt;one();\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;($user)&nbsp;{\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$result['error']&nbsp;=&nbsp;0;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$result['msg']&nbsp;=&nbsp;'\u83b7\u53d6\u6210\u529f';\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$result['user']&nbsp;=&nbsp;$user;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;else&nbsp;{\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$result['error']&nbsp;=&nbsp;1;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$result['msg']&nbsp;=&nbsp;'\u6ca1\u6709\u8be5\u7528\u6237';\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}\r\n&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;else&nbsp;{\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$result['error']&nbsp;=&nbsp;1;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$result['msg']&nbsp;=&nbsp;'openid\u4e3a\u7a7a';\r\n&nbsp;&nbsp;&nbsp;&nbsp;}\r\n&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;$result;\r\n}<\/pre>\n<p> \u767b\u5f55\u540e\u590d\u5236 <\/p>\n<h2>\u5fae\u4fe1\u652f\u4ed8<\/h2>\n<p>1.\u5fae\u4fe1\u652f\u4ed8\u63a5\u53e3\uff1a\u6253\u5305\u652f\u4ed8\u6570\u636e<\/p>\n<pre>public&nbsp;function&nbsp;actionPay(){\r\n&nbsp;&nbsp;&nbsp;&nbsp;if(isset($_REQUEST[\"uid\"])&amp;amp;&amp;amp;isset($_REQUEST[\"oid\"])&amp;amp;&amp;amp;isset($_REQUEST[\"totalFee\"])){\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\/\/uid\u3001oid\u3001totalFee\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$uid&nbsp;=&nbsp;$_REQUEST[\"uid\"];\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$oid&nbsp;=&nbsp;$_REQUEST[\"oid\"];\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$totalFee&nbsp;=&nbsp;$_REQUEST[\"totalFee\"];\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$timestamp&nbsp;=&nbsp;time();\r\n\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\/\/\u5fae\u4fe1\u652f\u4ed8\u53c2\u6570\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$appid&nbsp;=&nbsp;Yii::$app-&amp;gt;params['wechat']['appid'];\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$mchid&nbsp;=&nbsp;Yii::$app-&amp;gt;params['wechat']['mchid'];\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$key&nbsp;=&nbsp;Yii::$app-&amp;gt;params['wechat']['key'];\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$notifyUrl&nbsp;=&nbsp;Yii::$app-&amp;gt;params['wechat']['notifyUrl'];\r\n\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\/\/\u652f\u4ed8\u6253\u5305\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$wx_pay&nbsp;=&nbsp;new&nbsp;WechatPay($mchid,&nbsp;$appid,&nbsp;$key);\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$package&nbsp;=&nbsp;$wx_pay-&amp;gt;createJsBizPackage($uid,&nbsp;$totalFee,&nbsp;$oid,&nbsp;$notifyUrl,&nbsp;$timestamp);\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$result['error']&nbsp;=&nbsp;0;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$result['msg']&nbsp;=&nbsp;'\u652f\u4ed8\u6253\u5305\u6210\u529f';\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$result['package']&nbsp;=&nbsp;$package;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;$result;\r\n&nbsp;&nbsp;&nbsp;&nbsp;}else{\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$result['error']&nbsp;=&nbsp;1;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$result['msg']&nbsp;=&nbsp;'\u8bf7\u6c42\u53c2\u6570\u9519\u8bef';\r\n&nbsp;&nbsp;&nbsp;&nbsp;}\r\n&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;$result;\r\n}<\/pre>\n<p> \u767b\u5f55\u540e\u590d\u5236 <\/p>\n<p>2.\u63a5\u6536\u5fae\u4fe1\u53d1\u9001\u7684\u5f02\u6b65\u652f\u4ed8\u7ed3\u679c\u901a\u77e5<\/p>\n<pre>public&nbsp;function&nbsp;actionNotify(){\r\n&nbsp;&nbsp;&nbsp;&nbsp;$postStr&nbsp;=&nbsp;$GLOBALS[\"HTTP_RAW_POST_DATA\"];\r\n&nbsp;&nbsp;&nbsp;&nbsp;$postObj&nbsp;=&nbsp;simplexml_load_string($postStr,&nbsp;'SimpleXMLElement',&nbsp;LIBXML_NOCDATA);\r\n&nbsp;&nbsp;&nbsp;&nbsp;\/\/\r\n&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;($postObj&nbsp;===&nbsp;false)&nbsp;{\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;die('parse&nbsp;xml&nbsp;error');\r\n&nbsp;&nbsp;&nbsp;&nbsp;}\r\n&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;($postObj-&amp;gt;return_code&nbsp;!=&nbsp;'SUCCESS')&nbsp;{\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;die($postObj-&amp;gt;return_msg);\r\n&nbsp;&nbsp;&nbsp;&nbsp;}\r\n&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;($postObj-&amp;gt;result_code&nbsp;!=&nbsp;'SUCCESS')&nbsp;{\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;die($postObj-&amp;gt;err_code);\r\n&nbsp;&nbsp;&nbsp;&nbsp;}\r\n\r\n&nbsp;&nbsp;&nbsp;&nbsp;\/\/\u5fae\u4fe1\u652f\u4ed8\u53c2\u6570\r\n&nbsp;&nbsp;&nbsp;&nbsp;$appid&nbsp;=&nbsp;Yii::$app-&amp;gt;params['wechat']['appid'];\r\n&nbsp;&nbsp;&nbsp;&nbsp;$mchid&nbsp;=&nbsp;Yii::$app-&amp;gt;params['wechat']['mchid'];\r\n&nbsp;&nbsp;&nbsp;&nbsp;$key&nbsp;=&nbsp;Yii::$app-&amp;gt;params['wechat']['key'];\r\n&nbsp;&nbsp;&nbsp;&nbsp;$wx_pay&nbsp;=&nbsp;new&nbsp;WechatPay($mchid,&nbsp;$appid,&nbsp;$key);\r\n\r\n&nbsp;&nbsp;&nbsp;&nbsp;\/\/\u9a8c\u8bc1\u7b7e\u540d\r\n&nbsp;&nbsp;&nbsp;&nbsp;$arr&nbsp;=&nbsp;(array)$postObj;\r\n&nbsp;&nbsp;&nbsp;&nbsp;unset($arr['sign']);\r\n&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;($wx_pay-&amp;gt;getSign($arr,&nbsp;$key)&nbsp;!=&nbsp;$postObj-&amp;gt;sign)&nbsp;{\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;die(\"\u7b7e\u540d\u9519\u8bef\");\r\n&nbsp;&nbsp;&nbsp;&nbsp;}\r\n\r\n&nbsp;&nbsp;&nbsp;&nbsp;\/\/\u652f\u4ed8\u5904\u7406\u6b63\u786e-\u5224\u65ad\u662f\u5426\u5df2\u5904\u7406\u8fc7\u652f\u4ed8\u72b6\u6001\r\n&nbsp;&nbsp;&nbsp;&nbsp;$orders&nbsp;=&nbsp;Order::find()-&amp;gt;where(['uid'=&amp;gt;$postObj-&amp;gt;openid,&nbsp;'oid'=&amp;gt;$postObj-&amp;gt;out_trade_no,&nbsp;'status'&nbsp;=&amp;gt;&nbsp;0])-&amp;gt;all();\r\n\r\n&nbsp;&nbsp;&nbsp;&nbsp;if(count($orders)&nbsp;&amp;gt;&nbsp;0){\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\/\/\u66f4\u65b0\u8ba2\u5355\u72b6\u6001\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;foreach&nbsp;($orders&nbsp;as&nbsp;$order)&nbsp;{\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\/\/\u66f4\u65b0\u8ba2\u5355\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$order['status']&nbsp;=&nbsp;1;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$order-&amp;gt;update();\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;'&lt;xml&gt;&lt;return_code&gt;&lt;\/return_code&gt;&lt;return_msg&gt;&lt;\/return_msg&gt;&lt;\/xml&gt;';\r\n&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;else&nbsp;{\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\/\/\u8ba2\u5355\u72b6\u6001\u5df2\u66f4\u65b0\uff0c\u76f4\u63a5\u8fd4\u56de\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;'&lt;xml&gt;&lt;return_code&gt;&lt;\/return_code&gt;&lt;return_msg&gt;&lt;\/return_msg&gt;&lt;\/xml&gt;';\r\n&nbsp;&nbsp;&nbsp;&nbsp;}\r\n}<\/pre>\n<p> \u767b\u5f55\u540e\u590d\u5236 <\/p>\n<p>3.\u5fae\u4fe1\u652f\u4ed8\u7c7b WechatPay.php<\/p>\n<pre>&lt;?php namespace apisdk;\r\n\r\nuse Yii;\r\n\r\nclass WechatPay\r\n{\r\n    protected $mchid;\r\n    protected $appid;\r\n    protected $key;\r\n\r\n    public function construct($mchid, $appid, $key){\r\n        $this-&gt;mchid&nbsp;=&nbsp;$mchid;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$this-&amp;gt;appid&nbsp;=&nbsp;$appid;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$this-&amp;gt;key&nbsp;=&nbsp;$key;\r\n&nbsp;&nbsp;&nbsp;&nbsp;}\r\n\r\n&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;function&nbsp;createJsBizPackage($openid,&nbsp;$totalFee,&nbsp;$outTradeNo,&nbsp;$orderName,&nbsp;$notifyUrl,&nbsp;$timestamp){\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$config&nbsp;=&nbsp;array(\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'mch_id'&nbsp;=&amp;gt;&nbsp;$this-&amp;gt;mchid,\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'appid'&nbsp;=&amp;gt;&nbsp;$this-&amp;gt;appid,\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'key'&nbsp;=&amp;gt;&nbsp;$this-&amp;gt;key,\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;);\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$unified&nbsp;=&nbsp;array(\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'appid'&nbsp;=&amp;gt;&nbsp;$config['appid'],\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'attach'&nbsp;=&amp;gt;&nbsp;'\u652f\u4ed8',\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'body'&nbsp;=&amp;gt;&nbsp;$orderName,\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'mch_id'&nbsp;=&amp;gt;&nbsp;$config['mch_id'],\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'nonce_str'&nbsp;=&amp;gt;&nbsp;self::createNonceStr(),\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'notify_url'&nbsp;=&amp;gt;&nbsp;$notifyUrl,\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'openid'&nbsp;=&amp;gt;&nbsp;$openid,\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'out_trade_no'&nbsp;=&amp;gt;&nbsp;$outTradeNo,\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'spbill_create_ip'&nbsp;=&amp;gt;&nbsp;'127.0.0.1',\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'total_fee'&nbsp;=&amp;gt;&nbsp;intval($totalFee&nbsp;*&nbsp;100),\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'trade_type'&nbsp;=&amp;gt;&nbsp;'JSAPI',\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;);\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$unified['sign']&nbsp;=&nbsp;self::getSign($unified,&nbsp;$config['key']);\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$responseXml&nbsp;=&nbsp;self::curlPost('https:\/\/api.mch.weixin.qq.com\/pay\/unifiedorder',&nbsp;self::arrayToXml($unified));\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$unifiedOrder&nbsp;=&nbsp;simplexml_load_string($responseXml,&nbsp;'SimpleXMLElement',&nbsp;LIBXML_NOCDATA);\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;($unifiedOrder&nbsp;===&nbsp;false)&nbsp;{\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;die('parse&nbsp;xml&nbsp;error');\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;($unifiedOrder-&amp;gt;return_code&nbsp;!=&nbsp;'SUCCESS')&nbsp;{\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;die($unifiedOrder-&amp;gt;return_msg);\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;($unifiedOrder-&amp;gt;result_code&nbsp;!=&nbsp;'SUCCESS')&nbsp;{\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;die($unifiedOrder-&amp;gt;err_code);\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$arr&nbsp;=&nbsp;array(\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\"appId\"&nbsp;=&amp;gt;&nbsp;$config['appid'],\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\"timeStamp\"&nbsp;=&amp;gt;&nbsp;$timestamp,\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\"nonceStr\"&nbsp;=&amp;gt;&nbsp;self::createNonceStr(),\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\"package\"&nbsp;=&amp;gt;&nbsp;\"prepay_id=\"&nbsp;.&nbsp;$unifiedOrder-&amp;gt;prepay_id,\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\"signType\"&nbsp;=&amp;gt;&nbsp;'MD5',\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;);\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$arr['paySign']&nbsp;=&nbsp;self::getSign($arr,&nbsp;$config['key']);\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;$arr;\r\n&nbsp;&nbsp;&nbsp;&nbsp;}\r\n\r\n&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;static&nbsp;function&nbsp;curlGet($url&nbsp;=&nbsp;'',&nbsp;$options&nbsp;=&nbsp;array()){\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$ch&nbsp;=&nbsp;curl_init($url);\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;curl_setopt($ch,&nbsp;CURLOPT_RETURNTRANSFER,&nbsp;1);\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;curl_setopt($ch,&nbsp;CURLOPT_TIMEOUT,&nbsp;30);\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(!empty($options))&nbsp;{\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;curl_setopt_array($ch,&nbsp;$options);\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\/\/https\u8bf7\u6c42&nbsp;\u4e0d\u9a8c\u8bc1\u8bc1\u4e66\u548chost\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;curl_setopt($ch,&nbsp;CURLOPT_SSL_VERIFYPEER,&nbsp;false);\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;curl_setopt($ch,&nbsp;CURLOPT_SSL_VERIFYHOST,&nbsp;false);\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$data&nbsp;=&nbsp;curl_exec($ch);\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;curl_close($ch);\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;$data;\r\n&nbsp;&nbsp;&nbsp;&nbsp;}\r\n\r\n\r\n&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;static&nbsp;function&nbsp;curlPost($url&nbsp;=&nbsp;'',&nbsp;$postData&nbsp;=&nbsp;'',&nbsp;$options&nbsp;=&nbsp;array()){\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(is_array($postData))&nbsp;{\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$postData&nbsp;=&nbsp;http_build_query($postData);\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$ch&nbsp;=&nbsp;curl_init();\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;curl_setopt($ch,&nbsp;CURLOPT_URL,&nbsp;$url);\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;curl_setopt($ch,&nbsp;CURLOPT_RETURNTRANSFER,&nbsp;1);\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;curl_setopt($ch,&nbsp;CURLOPT_POST,&nbsp;1);\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;curl_setopt($ch,&nbsp;CURLOPT_POSTFIELDS,&nbsp;$postData);\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;curl_setopt($ch,&nbsp;CURLOPT_TIMEOUT,&nbsp;30);&nbsp;\/\/\u8bbe\u7f6ecURL\u5141\u8bb8\u6267\u884c\u7684\u6700\u957f\u79d2\u6570\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(!empty($options))&nbsp;{\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;curl_setopt_array($ch,&nbsp;$options);\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\/\/https\u8bf7\u6c42&nbsp;\u4e0d\u9a8c\u8bc1\u8bc1\u4e66\u548chost\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;curl_setopt($ch,&nbsp;CURLOPT_SSL_VERIFYPEER,&nbsp;false);\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;curl_setopt($ch,&nbsp;CURLOPT_SSL_VERIFYHOST,&nbsp;false);\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$data&nbsp;=&nbsp;curl_exec($ch);\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;curl_close($ch);\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;$data;\r\n&nbsp;&nbsp;&nbsp;&nbsp;}\r\n\r\n&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;static&nbsp;function&nbsp;createNonceStr($length&nbsp;=&nbsp;16){\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$chars&nbsp;=&nbsp;'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$str&nbsp;=&nbsp;'';\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;($i&nbsp;=&nbsp;0;&nbsp;$i\";\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;foreach&nbsp;($arr&nbsp;as&nbsp;$key&nbsp;=&amp;gt;&nbsp;$val){\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(is_numeric($val))&nbsp;{\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$xml&nbsp;.=&nbsp;\"\"&nbsp;.&nbsp;$val&nbsp;.&nbsp;\"\"&nbsp;.&nbsp;$key&nbsp;.&nbsp;\"&amp;gt;\";\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;else&nbsp;{\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$xml&nbsp;.=&nbsp;\"\"&nbsp;.&nbsp;$key&nbsp;.&nbsp;\"&amp;gt;\";\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$xml&nbsp;.=&nbsp;\"\";\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;$xml;\r\n&nbsp;&nbsp;&nbsp;&nbsp;}\r\n\r\n&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;static&nbsp;function&nbsp;getSign($params,&nbsp;$key){\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ksort($params,&nbsp;SORT_STRING);\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$unSignParaString&nbsp;=&nbsp;self::formatQueryParaMap($params,&nbsp;false);\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$signStr&nbsp;=&nbsp;strtoupper(md5($unSignParaString&nbsp;.&nbsp;\"&amp;amp;key=\"&nbsp;.&nbsp;$key));\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;$signStr;\r\n&nbsp;&nbsp;&nbsp;&nbsp;}\r\n\r\n&nbsp;&nbsp;&nbsp;&nbsp;protected&nbsp;static&nbsp;function&nbsp;formatQueryParaMap($paraMap,&nbsp;$urlEncode&nbsp;=&nbsp;false){\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$buff&nbsp;=&nbsp;\"\";\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ksort($paraMap);\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;foreach&nbsp;($paraMap&nbsp;as&nbsp;$k&nbsp;=&amp;gt;&nbsp;$v){\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(null&nbsp;!=&nbsp;$v&nbsp;&amp;amp;&amp;amp;&nbsp;\"null\"&nbsp;!=&nbsp;$v)&nbsp;{\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;($urlEncode)&nbsp;{\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$v&nbsp;=&nbsp;urlencode($v);\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$buff&nbsp;.=&nbsp;$k&nbsp;.&nbsp;\"=\"&nbsp;.&nbsp;$v&nbsp;.&nbsp;\"&amp;amp;\";\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$reqPar&nbsp;=&nbsp;'';\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(strlen($buff)&amp;gt;0)&nbsp;{\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$reqPar&nbsp;=&nbsp;substr($buff,&nbsp;0,&nbsp;strlen($buff)&nbsp;-&nbsp;1);\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;$reqPar;\r\n&nbsp;&nbsp;&nbsp;&nbsp;}\r\n\r\n}<\/pre>\n<p> \u767b\u5f55\u540e\u590d\u5236 <\/p>\n<h2>\u83b7\u53d6JS-SDK\u7684config\u53c2\u6570<\/h2>\n<p>\u6839\u636e\u5fae\u4fe1\u516c\u4f17\u5e73\u53f0\u5f00\u53d1\u8005\u6587\u6863\uff1a<\/p>\n<p>\u6240\u6709\u9700\u8981\u4f7f\u7528JS-SDK\u7684\u9875\u9762\u5fc5\u987b\u5148\u6ce8\u5165\u914d\u7f6e\u4fe1\u606f\uff0c\u5426\u5219\u5c06\u65e0\u6cd5\u8c03\u7528\uff08\u540c\u4e00\u4e2aurl\u4ec5\u9700\u8c03\u7528\u4e00\u6b21\uff0c\u5bf9\u4e8e\u53d8\u5316url\u7684SPA\u7684web app\u53ef\u5728\u6bcf\u6b21url\u53d8\u5316\u65f6\u8fdb\u884c\u8c03\u7528,\u76ee\u524d\u5fae\u4fe1\u5ba2\u6237\u7aef\u4e0d\u652f\u6301pushState\u7684H5\u65b0\u7279\u6027\uff0c\u6240\u4ee5\u4f7f\u7528pushState\u6765\u5b9e\u73b0web app\u7684\u9875\u9762\u4f1a\u5bfc\u81f4\u7b7e\u540d\u5931\u8d25\uff0c\u6b64\u95ee\u9898\u4f1a\u5728Android6.2\u4e2d\u4fee\u590d\uff09\u3002<\/p>\n<p>\u5373\uff1a<\/p>\n<pre>wx.config({\r\n&nbsp;&nbsp;&nbsp;&nbsp;debug:&nbsp;true,&nbsp;\/\/&nbsp;\u5f00\u542f\u8c03\u8bd5\u6a21\u5f0f,\u8c03\u7528\u7684\u6240\u6709api\u7684\u8fd4\u56de\u503c\u4f1a\u5728\u5ba2\u6237\u7aefalert\u51fa\u6765\uff0c\u82e5\u8981\u67e5\u770b\u4f20\u5165\u7684\u53c2\u6570\uff0c\u53ef\u4ee5\u5728pc\u7aef\u6253\u5f00\uff0c\u53c2\u6570\u4fe1\u606f\u4f1a\u901a\u8fc7log\u6253\u51fa\uff0c\u4ec5\u5728pc\u7aef\u65f6\u624d\u4f1a\u6253\u5370\u3002\r\n&nbsp;&nbsp;&nbsp;&nbsp;appId:&nbsp;'',&nbsp;\/\/&nbsp;\u5fc5\u586b\uff0c\u516c\u4f17\u53f7\u7684\u552f\u4e00\u6807\u8bc6\r\n&nbsp;&nbsp;&nbsp;&nbsp;timestamp:&nbsp;,&nbsp;\/\/&nbsp;\u5fc5\u586b\uff0c\u751f\u6210\u7b7e\u540d\u7684\u65f6\u95f4\u6233\r\n&nbsp;&nbsp;&nbsp;&nbsp;nonceStr:&nbsp;'',&nbsp;\/\/&nbsp;\u5fc5\u586b\uff0c\u751f\u6210\u7b7e\u540d\u7684\u968f\u673a\u4e32\r\n&nbsp;&nbsp;&nbsp;&nbsp;signature:&nbsp;'',\/\/&nbsp;\u5fc5\u586b\uff0c\u7b7e\u540d\uff0c\u89c1\u9644\u5f551\r\n&nbsp;&nbsp;&nbsp;&nbsp;jsApiList:&nbsp;[]&nbsp;\/\/&nbsp;\u5fc5\u586b\uff0c\u9700\u8981\u4f7f\u7528\u7684JS\u63a5\u53e3\u5217\u8868\uff0c\u6240\u6709JS\u63a5\u53e3\u5217\u8868\u89c1\u9644\u5f552\r\n});<\/pre>\n<p> \u767b\u5f55\u540e\u590d\u5236 <\/p>\n<p>1.\u5fae\u4fe1\u652f\u4ed8\u7c7b WechatPay.php<\/p>\n<pre>&lt;?php namespace apisdk;\r\n\r\nuse Yii;\r\n\r\nclass WechatPay\r\n{\r\n\r\n    public function getSignPackage($url) {\r\n        $jsapiTicket = self::getJsApiTicket();\r\n\r\n        $timestamp = time();\r\n        $nonceStr = self::createNonceStr();\r\n\r\n        \/\/ \u8fd9\u91cc\u53c2\u6570\u7684\u987a\u5e8f\u8981\u6309\u7167 key \u503c ASCII \u7801\u5347\u5e8f\u6392\u5e8f\r\n        $string = \"jsapi_ticket=\".$jsapiTicket.\"&amp;noncestr=\".$nonceStr.\"\u00d7tamp=\".$timestamp.\"&amp;url=\".$url;\r\n\r\n        $signature = sha1($string);\r\n\r\n        $signPackage = array(\r\n            \"appId\"     =&gt;&nbsp;$this-&amp;gt;appid,\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\"nonceStr\"&nbsp;&nbsp;=&amp;gt;&nbsp;$nonceStr,\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\"timestamp\"&nbsp;=&amp;gt;&nbsp;$timestamp,\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\"url\"&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&amp;gt;&nbsp;$url,\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\"signature\"&nbsp;=&amp;gt;&nbsp;$signature,\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\"rawString\"&nbsp;=&amp;gt;&nbsp;$string\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;);\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;$signPackage;\r\n&nbsp;&nbsp;&nbsp;&nbsp;}\r\n\r\n&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;static&nbsp;function&nbsp;getJsApiTicket()&nbsp;{\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\/\/\u4f7f\u7528Redis\u7f13\u5b58&nbsp;jsapi_ticket\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$redis&nbsp;=&nbsp;Yii::$app-&amp;gt;redis;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$redis_ticket&nbsp;=&nbsp;$redis-&amp;gt;get('wechat:jsapi_ticket');\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;($redis_ticket)&nbsp;{\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$ticket&nbsp;=&nbsp;$redis_ticket;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;else&nbsp;{\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$accessToken&nbsp;=&nbsp;self::getAccessToken();\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$url&nbsp;=&nbsp;\"https:\/\/api.weixin.qq.com\/cgi-bin\/ticket\/getticket?type=jsapi&amp;amp;access_token=\".$accessToken;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$res&nbsp;=&nbsp;json_decode(self::curlGet($url));\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$ticket&nbsp;=&nbsp;$res-&amp;gt;ticket;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;($ticket)&nbsp;{\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$redis-&amp;gt;set('wechat:jsapi_ticket',&nbsp;$ticket);\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$redis-&amp;gt;expire('wechat:jsapi_ticket',&nbsp;7000);\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;$ticket;\r\n&nbsp;&nbsp;&nbsp;&nbsp;}\r\n\r\n&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;static&nbsp;function&nbsp;getAccessToken()&nbsp;{\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\/\/\u4f7f\u7528Redis\u7f13\u5b58&nbsp;access_token\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$redis&nbsp;=&nbsp;Yii::$app-&amp;gt;redis;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$redis_token&nbsp;=&nbsp;$redis-&amp;gt;get('wechat:access_token');\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;($redis_token)&nbsp;{\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$access_token&nbsp;=&nbsp;$redis_token;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;else&nbsp;{\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$appid&nbsp;=&nbsp;Yii::$app-&amp;gt;params['wechat']['appid'];\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$appsecret&nbsp;=&nbsp;Yii::$app-&amp;gt;params['wechat']['appsecret'];\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$url&nbsp;=&nbsp;\"https:\/\/api.weixin.qq.com\/cgi-bin\/token?grant_type=client_credential&amp;amp;appid=\".$appid.\"&amp;amp;secret=\".$appsecret;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$res&nbsp;=&nbsp;json_decode(self::curlGet($url));\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$access_token&nbsp;=&nbsp;$res-&amp;gt;access_token;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;($access_token)&nbsp;{\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$redis-&amp;gt;set('wechat:access_token',&nbsp;$access_token);\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$redis-&amp;gt;expire('wechat:access_token',&nbsp;7000);\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;$access_token;\r\n&nbsp;&nbsp;&nbsp;&nbsp;}\r\n\r\n&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;static&nbsp;function&nbsp;curlGet($url&nbsp;=&nbsp;'',&nbsp;$options&nbsp;=&nbsp;array()){\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$ch&nbsp;=&nbsp;curl_init($url);\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;curl_setopt($ch,&nbsp;CURLOPT_RETURNTRANSFER,&nbsp;1);\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;curl_setopt($ch,&nbsp;CURLOPT_TIMEOUT,&nbsp;30);\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(!empty($options))&nbsp;{\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;curl_setopt_array($ch,&nbsp;$options);\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\/\/https\u8bf7\u6c42&nbsp;\u4e0d\u9a8c\u8bc1\u8bc1\u4e66\u548chost\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;curl_setopt($ch,&nbsp;CURLOPT_SSL_VERIFYPEER,&nbsp;false);\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;curl_setopt($ch,&nbsp;CURLOPT_SSL_VERIFYHOST,&nbsp;false);\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$data&nbsp;=&nbsp;curl_exec($ch);\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;curl_close($ch);\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;$data;\r\n&nbsp;&nbsp;&nbsp;&nbsp;}\r\n\r\n&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;static&nbsp;function&nbsp;curlPost($url&nbsp;=&nbsp;'',&nbsp;$postData&nbsp;=&nbsp;'',&nbsp;$options&nbsp;=&nbsp;array()){\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(is_array($postData))&nbsp;{\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$postData&nbsp;=&nbsp;http_build_query($postData);\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$ch&nbsp;=&nbsp;curl_init();\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;curl_setopt($ch,&nbsp;CURLOPT_URL,&nbsp;$url);\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;curl_setopt($ch,&nbsp;CURLOPT_RETURNTRANSFER,&nbsp;1);\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;curl_setopt($ch,&nbsp;CURLOPT_POST,&nbsp;1);\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;curl_setopt($ch,&nbsp;CURLOPT_POSTFIELDS,&nbsp;$postData);\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;curl_setopt($ch,&nbsp;CURLOPT_TIMEOUT,&nbsp;30);&nbsp;\/\/\u8bbe\u7f6ecURL\u5141\u8bb8\u6267\u884c\u7684\u6700\u957f\u79d2\u6570\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(!empty($options))&nbsp;{\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;curl_setopt_array($ch,&nbsp;$options);\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\/\/https\u8bf7\u6c42&nbsp;\u4e0d\u9a8c\u8bc1\u8bc1\u4e66\u548chost\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;curl_setopt($ch,&nbsp;CURLOPT_SSL_VERIFYPEER,&nbsp;false);\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;curl_setopt($ch,&nbsp;CURLOPT_SSL_VERIFYHOST,&nbsp;false);\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$data&nbsp;=&nbsp;curl_exec($ch);\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;curl_close($ch);\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;$data;\r\n&nbsp;&nbsp;&nbsp;&nbsp;}\r\n\r\n&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;static&nbsp;function&nbsp;createNonceStr($length&nbsp;=&nbsp;16){\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$chars&nbsp;=&nbsp;'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$str&nbsp;=&nbsp;'';\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;($i&nbsp;=&nbsp;0;&nbsp;$i&lt;p&gt;2.\u83b7\u53d6config\u53c2\u6570\u63a5\u53e3&lt;\/p&gt;&lt;pre class=\"brush:php;toolbar:false;\"&gt;public&nbsp;function&nbsp;actionConfig(){\r\n&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(isset($_REQUEST['url']))&nbsp;{\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$url&nbsp;=&nbsp;$_REQUEST['url'];\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\/\/\u5fae\u4fe1\u652f\u4ed8\u53c2\u6570\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$appid&nbsp;=&nbsp;Yii::$app-&amp;gt;params['wechat']['appid'];\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$mchid&nbsp;=&nbsp;Yii::$app-&amp;gt;params['wechat']['mchid'];\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$key&nbsp;=&nbsp;Yii::$app-&amp;gt;params['wechat']['key'];\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$wx_pay&nbsp;=&nbsp;new&nbsp;WechatPay($mchid,&nbsp;$appid,&nbsp;$key);\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$package&nbsp;=&nbsp;$wx_pay-&amp;gt;getSignPackage($url);\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$result['error']&nbsp;=&nbsp;0;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$result['msg']&nbsp;=&nbsp;'\u83b7\u53d6\u6210\u529f';\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$result['config']&nbsp;=&nbsp;$package;\r\n&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;else&nbsp;{\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$result['error']&nbsp;=&nbsp;1;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$result['msg']&nbsp;=&nbsp;'\u53c2\u6570\u9519\u8bef';\r\n&nbsp;&nbsp;&nbsp;&nbsp;}\r\n&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;$result;\r\n}<\/pre>\n<p> \u767b\u5f55\u540e\u590d\u5236 <\/p>\n<p>\u4ee5\u4e0a\u5c31\u662fYii2.0\u5b9e\u73b0\u5fae\u4fe1\u516c\u4f17\u53f7\u540e\u53f0\u5f00\u53d1\u7684\u8be6\u7ec6\u5185\u5bb9\uff0c\u66f4\u591a\u8bf7\u5173\u6ce8\u7c73\u4e91\u5176\u5b83\u76f8\u5173\u6587\u7ae0\uff01<\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u672c\u6587\u5185\u5bb9\u8f83\u591a\uff0c\u5305\u62ec\u5fae\u4fe1\u63a5\u5165\u3001\u83b7\u53d6\u5fae\u4fe1\u7528\u6237\u4fe1\u606f\u3001\u5fae\u4fe1\u652f\u4ed8\u3001JSSDK\u914d\u7f6e\u53c2\u6570\u83b7\u53d6\u7b49\u90e8\u5206\u3002\u5982\u679c\u8bfb\u8005\u5bf9\u5fae\u4fe1\u5f00\u53d1\u6ca1\u6709\u4e00\u4e2a\u4e3b\u89c2\u4e0a\u7684\u8ba4\u8bc6\uff0c\u90a3\u4e48\u5efa\u8bae\u8bfb\u8005\u5148\u7814\u8bfb \uff0c\u7136\u540e\u518d\u9605\u8bfb\u672c\u6587\uff0c\u6548\u679c\u66f4\u4f73\uff01\u53e6\u5916\u672c\u6587\u7684\u5206\u7ae0\u8282\u7248\u672c\u53ef\u4ee5\u5728 \u516b\u5b9d\u7ca5\u7684\u535a\u5ba2 \u627e\u5230\u3002 \u63a5\u5165\u5fae\u4fe1 Yii2\u540e\u53f0\u914d\u7f6e 1.\u5728app\/config\/params.php\u4e2d\u914d\u7f6etoken\u53c2\u6570 return&nbsp;[ &nbsp;&nbsp;&nbsp;&nbsp;\/\/\u5fae\u4fe1\u63a5\u5165 &nbsp;&nbsp;&nbsp;&nbsp;&#8216;wechat&#8217;&nbsp;=&amp;gt;[ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#8216;token&#8217;&nbsp;=&amp;gt;&nbsp;&#8216;your&nbsp;token&#8217;, &nbsp;&nbsp;&nbsp;&nbsp;], ]; \u767b\u5f55\u540e\u590d\u5236 2.\u5728app\/config\/main.php\u4e2d\u914d\u7f6e \u56e0\u4e3a\u63a5\u53e3\u6a21\u5757\u4f7f\u7528\u7684RESTful \uff0c\u6240\u4ee5\u9700\u8981\u89c4\u5219\u3002 &#8216;urlManager&#8217;&nbsp;=&amp;gt;&nbsp;[ &nbsp;&nbsp;&nbsp;&nbsp;&#8216;enablePrettyUrl&#8217;&nbsp;=&amp;gt;&nbsp;true, &nbsp;&nbsp;&nbsp;&nbsp;&#8216;enableStrictParsing&#8217;&nbsp;=&amp;gt;&nbsp;true, &nbsp;&nbsp;&nbsp;&nbsp;&#8216;showScriptName&#8217;&nbsp;=&amp;gt;&nbsp;false, &nbsp;&nbsp;&nbsp;&nbsp;&#8216;rules&#8217;&nbsp;=&amp;gt;&nbsp;[ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#8216;class&#8217;&nbsp;=&amp;gt;&nbsp;&#8216;yii estUrlRule&#8217;, &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#8216;controller&#8217;&nbsp;=&amp;gt;&nbsp;&#8216;wechat&#8217;, &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#8216;extraPatterns&#8217;&nbsp;=&amp;gt;&nbsp;[ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#8216;GET&nbsp;valid&#8217;&nbsp;=&amp;gt;&nbsp;&#8216;valid&#8217;, &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;], &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;], &nbsp;&nbsp;&nbsp;&nbsp;], ], \u767b\u5f55\u540e\u590d\u5236 3.\u5728app\/controllers\u4e2d\u65b0\u5efaWechatController &lt;?php namespace apicontrollers; use Yii; use yii estActiveController; class WechatController extends ActiveController { public $modelClass = &#039;&#039;; public function actionValid() { [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[19],"tags":[],"class_list":["post-29679","post","type-post","status-publish","format-standard","hentry","category-19"],"_links":{"self":[{"href":"https:\/\/fwq.ai\/blog\/wp-json\/wp\/v2\/posts\/29679","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/fwq.ai\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/fwq.ai\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/fwq.ai\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/fwq.ai\/blog\/wp-json\/wp\/v2\/comments?post=29679"}],"version-history":[{"count":0,"href":"https:\/\/fwq.ai\/blog\/wp-json\/wp\/v2\/posts\/29679\/revisions"}],"wp:attachment":[{"href":"https:\/\/fwq.ai\/blog\/wp-json\/wp\/v2\/media?parent=29679"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fwq.ai\/blog\/wp-json\/wp\/v2\/categories?post=29679"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fwq.ai\/blog\/wp-json\/wp\/v2\/tags?post=29679"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}