{"id":34027,"date":"2024-11-25T13:18:48","date_gmt":"2024-11-25T05:18:48","guid":{"rendered":"https:\/\/fwq.ai\/blog\/34027\/"},"modified":"2024-11-25T13:18:48","modified_gmt":"2024-11-25T05:18:48","slug":"%e5%88%86%e4%ba%ab%e5%be%ae%e4%bf%a1%e6%94%af%e4%bb%98v3%e7%89%88-php%e8%a7%a3%e5%af%86%e8%a7%a3%e5%af%86%e4%bb%a3%e7%a0%81","status":"publish","type":"post","link":"https:\/\/fwq.ai\/blog\/34027\/","title":{"rendered":"\u5206\u4eab\u5fae\u4fe1\u652f\u4ed8v3\u7248 php\u89e3\u5bc6\u89e3\u5bc6\u4ee3\u7801"},"content":{"rendered":"<p>\u5fae\u4fe1\u652f\u4ed8v3\u7248\u672c\u5c0f\u7a0b\u5e8f\u652f\u4ed8 php\u7b7e\u540d,\u9a8c\u7b7e,\u6570\u636e\u89e3\u5bc6\u4ee3\u7801\u5206\u4eab<\/p>\n<p><strong>\u5fae\u4fe1\u652f\u4ed8v3\u7248 php\u89e3\u5bc6\u89e3\u5bc6\u4ee3\u7801<\/strong><\/p>\n<p>\u6570\u636e\u89e3\u5bc6\u9700\u8981\u7528\u5230sodium\u6269\u5c55 \u5927\u90e8\u5206php\u7248\u672c\u9700\u8981\u5b89\u88c5<\/p>\n<p>\u8bc1\u4e66\u5e8f\u5217\u53f7\u53ef\u4ee5\u5728\u8fd9\u91cc\u67e5\u770bhttps:\/\/myssl.com\/cert_decode.html<\/p>\n<p>\u6211\u7528\u7684php7.4\u7248\u672c<\/p>\n<p><span>\u7acb\u5373\u5b66\u4e60<\/span>\u201c\u201d\uff1b<\/p>\n<p>\u76f4\u63a5\u4e0a\u4ee3\u7801:<\/p>\n<pre>\/\/\u5fae\u4fe1\u539f\u751f\u652f\u4ed8\nclass&nbsp;Wxpay\n{\n&nbsp;&nbsp;&nbsp;&nbsp;\/*\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;\u652f\u4ed8(\u5c0f\u7a0b\u5e8f\u652f\u4ed8)\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@param&nbsp;type&nbsp;$sn&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\u8ba2\u5355\u7f16\u53f7\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@param&nbsp;type&nbsp;$money&nbsp;&nbsp;\u91d1\u989d\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@param&nbsp;type&nbsp;$openid&nbsp;&nbsp;\u7528\u6237\u5c0f\u7a0b\u5e8fopenid\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@return&nbsp;type\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*\/\n&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;static&nbsp;function&nbsp;getPayParam($sn,&nbsp;$money,&nbsp;$openid)\n&nbsp;&nbsp;&nbsp;&nbsp;{\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$url&nbsp;=&nbsp;'https:\/\/api.mch.weixin.qq.com\/v3\/pay\/transactions\/jsapi';\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$notify_url&nbsp;=&nbsp;url('\/api\/weixin\/notify');\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$data&nbsp;=&nbsp;[];\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$data['appid']&nbsp;=&nbsp;Action::config(CONFIG_WXXCX,&nbsp;'app_id');\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$data['mchid']&nbsp;=&nbsp;Action::config(CONFIG_WXXCX,&nbsp;'mchid');&nbsp;\/\/\u5546\u6237\u53f7\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$data['description']&nbsp;=&nbsp;'xxx';&nbsp;\/\/\u63cf\u8ff0\uff1f\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$data['out_trade_no']&nbsp;=&nbsp;$sn;&nbsp;\/\/\u5546\u6237\u7cfb\u7edf\u5185\u90e8\u8ba2\u5355\u53f7\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$data['time_expire']&nbsp;=&nbsp;date('Y-m-d')&nbsp;.&nbsp;'T'&nbsp;.&nbsp;date('H:i:s',&nbsp;(time()&nbsp;+&nbsp;1800))&nbsp;.&nbsp;'+08:00';&nbsp;\/\/\u8ba2\u5355\u5931\u6548\u65f6\u95f42018-06-08T10:34:56+08:00\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$data['notify_url']&nbsp;=&nbsp;$notify_url;&nbsp;\/\/\u5f02\u6b65\u901a\u77e5\u63a5\u53e3\u5730\u5740\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$data['amount']&nbsp;=&nbsp;['total'&nbsp;=&amp;gt;&nbsp;$money&nbsp;*&nbsp;100,&nbsp;'currency'&nbsp;=&amp;gt;&nbsp;'CNY'];&nbsp;\/\/\u91d1\u989d\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$data['payer']&nbsp;=&nbsp;['openid'&nbsp;=&amp;gt;&nbsp;$openid];&nbsp;\/\/\u7528\u6237\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$re&nbsp;=&nbsp;self::wxCurl($url,&nbsp;$data,&nbsp;'POST');\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(!isset($re['prepay_id']))&nbsp;{\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;api_fail('\u53c2\u6570\u83b7\u53d6\u5931\u8d25');\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$result&nbsp;=&nbsp;[];\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$result['appId']&nbsp;=&nbsp;Action::config(CONFIG_WXXCX,&nbsp;'app_id');\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$result['timeStamp']&nbsp;=&nbsp;(string)time();\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$result['nonceStr']&nbsp;=&nbsp;uniqid();\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$result['package']&nbsp;=&nbsp;'prepay_id='&nbsp;.&nbsp;$re['prepay_id'];\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$result['signType']&nbsp;=&nbsp;'RSA';\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$result['paySign']&nbsp;=&nbsp;self::getPaySign($result);\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;$result;\n&nbsp;&nbsp;&nbsp;&nbsp;}\n&nbsp;&nbsp;&nbsp;&nbsp;\/**\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;\u67e5\u8be2\u8ba2\u5355\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@param&nbsp;type&nbsp;$sn\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*\/\n&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;static&nbsp;function&nbsp;select($sn,&nbsp;$return&nbsp;=&nbsp;false)\n&nbsp;&nbsp;&nbsp;&nbsp;{\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$mchid&nbsp;=&nbsp;Action::config(CONFIG_WXXCX,&nbsp;'mchid');&nbsp;\/\/\u5546\u6237\u53f7\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$url&nbsp;=&nbsp;'https:\/\/api.mch.weixin.qq.com\/v3\/pay\/transactions\/out-trade-no\/'&nbsp;.&nbsp;$sn&nbsp;.&nbsp;'?mchid='&nbsp;.&nbsp;$mchid;\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$re&nbsp;=&nbsp;self::wxCurl($url,&nbsp;[],&nbsp;'GET');\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;($return)&nbsp;{\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;$re;\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(isset($re['trade_state'])&nbsp;&amp;amp;&amp;amp;&nbsp;$re['trade_state']&nbsp;==&nbsp;'SUCCESS')&nbsp;{\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;true;\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;false;\n&nbsp;&nbsp;&nbsp;&nbsp;}\n&nbsp;&nbsp;&nbsp;&nbsp;\/**\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;\u5173\u95ed\u8ba2\u5355\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@param&nbsp;type&nbsp;$sn\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*\/\n&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;static&nbsp;function&nbsp;close($sn)\n&nbsp;&nbsp;&nbsp;&nbsp;{\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$mchid&nbsp;=&nbsp;Action::config(CONFIG_WXXCX,&nbsp;'mchid');&nbsp;\/\/\u5546\u6237\u53f7\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$url&nbsp;=&nbsp;'https:\/\/api.mch.weixin.qq.com\/v3\/pay\/transactions\/out-trade-no\/'&nbsp;.&nbsp;$sn&nbsp;.&nbsp;'\/close';\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$re&nbsp;=&nbsp;self::wxCurl($url,&nbsp;['mchid'=&amp;gt;$mchid],&nbsp;'POST');\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;true;\n&nbsp;&nbsp;&nbsp;&nbsp;}\n&nbsp;&nbsp;&nbsp;&nbsp;\/**\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;\u9000\u6b3e\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@param&nbsp;type&nbsp;$sn\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*\/\n&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;static&nbsp;function&nbsp;refund($order_sn,$refund_sn,$total,$refund,$msg='\u9000\u6b3e')\n&nbsp;&nbsp;&nbsp;&nbsp;{\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$url='https:\/\/api.mch.weixin.qq.com\/v3\/refund\/domestic\/refunds';\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$data=[];\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$data['notify_url']=url('ag\/weixin\/notify_refund');\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$data['out_trade_no']=$order_sn;\/\/\u8ba2\u5355\u53f7\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$data['out_refund_no']=$refund_sn;\/\/\u9000\u6b3e\u5355\u53f7\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$data['reason']=$msg;\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$data['amount']=['refund'=&amp;gt;$refund*100,'total'=&amp;gt;$total*100,'currency'=&amp;gt;'CNY'];\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$re&nbsp;=&nbsp;self::wxCurl($url,&nbsp;$data,&nbsp;'POST');\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;$re;\n&nbsp;&nbsp;&nbsp;&nbsp;}\n&nbsp;&nbsp;&nbsp;&nbsp;\/\/\u8bf7\u6c42\n&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;static&nbsp;function&nbsp;wxCurl($url,&nbsp;$data&nbsp;=&nbsp;[],&nbsp;$method&nbsp;=&nbsp;'GET')\n&nbsp;&nbsp;&nbsp;&nbsp;{\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$Authorization&nbsp;=&nbsp;self::getReSign($url,&nbsp;$data,&nbsp;$method);\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$header&nbsp;=&nbsp;[\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'Content-Type:&nbsp;application\/json',\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'Accept:&nbsp;application\/json',\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'User-Agent:&nbsp;Mozilla\/5.0&nbsp;(Windows&nbsp;NT&nbsp;10.0;&nbsp;Win64;&nbsp;x64)&nbsp;AppleWebKit\/537.36&nbsp;(KHTML,&nbsp;like&nbsp;Gecko)&nbsp;Chrome\/89.0.4389.90&nbsp;Safari\/537.36&nbsp;Edg\/89.0.774.63',\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'Authorization:&nbsp;'&nbsp;.&nbsp;$Authorization\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;];\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$redata&nbsp;=&nbsp;$data&nbsp;?&nbsp;json_encode($data)&nbsp;:&nbsp;'';\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$res&nbsp;=&nbsp;reCurl($url,&nbsp;$redata,&nbsp;$header);\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;$res&nbsp;?&nbsp;json_decode($res,&nbsp;true)&nbsp;:&nbsp;[];\n&nbsp;&nbsp;&nbsp;&nbsp;}\n&nbsp;&nbsp;&nbsp;&nbsp;\/\/\u540e\u7aef\u8bf7\u6c42\u7b7e\u540d\n&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;static&nbsp;function&nbsp;getReSign($url,&nbsp;$data,&nbsp;$method&nbsp;=&nbsp;'GET')\n&nbsp;&nbsp;&nbsp;&nbsp;{\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$url_parts&nbsp;=&nbsp;parse_url($url);\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$canonical_url&nbsp;=&nbsp;($url_parts['path']&nbsp;.&nbsp;(!empty($url_parts['query'])&nbsp;?&nbsp;\"?${url_parts['query']}\"&nbsp;:&nbsp;\"\"));\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$http_method&nbsp;=&nbsp;$method;\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$timestamp&nbsp;=&nbsp;time();\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$nonce&nbsp;=&nbsp;uniqid();\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$body&nbsp;=&nbsp;$data&nbsp;?&nbsp;json_encode($data)&nbsp;:&nbsp;'';\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$mchid&nbsp;=&nbsp;Action::config(CONFIG_WXXCX,&nbsp;'mchid');&nbsp;\/\/\u5546\u6237id\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$serial_no&nbsp;=&nbsp;Action::config(CONFIG_WXXCX,&nbsp;'serial_no');&nbsp;\/\/\u8bc1\u4e66\u7f16\u53f7\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$private_key&nbsp;=&nbsp;self::getPrivateKey(BASE_PATH&nbsp;.&nbsp;'cert\/apiclient_key.pem');&nbsp;\/\/\u5546\u6237\u79c1\u94a5\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$message&nbsp;=&nbsp;$http_method&nbsp;.&nbsp;\"\n\"&nbsp;.\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$canonical_url&nbsp;.&nbsp;\"\n\"&nbsp;.\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$timestamp&nbsp;.&nbsp;\"\n\"&nbsp;.\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$nonce&nbsp;.&nbsp;\"\n\"&nbsp;.\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$body&nbsp;.&nbsp;\"\n\";\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;openssl_sign($message,&nbsp;$raw_sign,&nbsp;$private_key,&nbsp;'sha256WithRSAEncryption');\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$sign&nbsp;=&nbsp;base64_encode($raw_sign);\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$token&nbsp;=&nbsp;sprintf('mchid=\"%s\",nonce_str=\"%s\",timestamp=\"%d\",serial_no=\"%s\",signature=\"%s\"',&nbsp;$mchid,&nbsp;$nonce,&nbsp;$timestamp,&nbsp;$serial_no,&nbsp;$sign);\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;'WECHATPAY2-SHA256-RSA2048&nbsp;'&nbsp;.&nbsp;$token;\n&nbsp;&nbsp;&nbsp;&nbsp;}\n&nbsp;&nbsp;&nbsp;&nbsp;\/\/\u524d\u7aef\u5c0f\u7a0b\u5e8f\u7b7e\u540d\n&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;static&nbsp;function&nbsp;getPaySign($result)\n&nbsp;&nbsp;&nbsp;&nbsp;{\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$private_key&nbsp;=&nbsp;self::getPrivateKey(BASE_PATH&nbsp;.&nbsp;'cert\/apiclient_key.pem');&nbsp;\/\/\u5546\u6237\u79c1\u94a5\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$message&nbsp;=&nbsp;$result['appId']&nbsp;.&nbsp;\"\n\"&nbsp;.\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$result['timeStamp']&nbsp;.&nbsp;\"\n\"&nbsp;.\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$result['nonceStr']&nbsp;.&nbsp;\"\n\"&nbsp;.\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$result['package']&nbsp;.&nbsp;\"\n\";\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;openssl_sign($message,&nbsp;$raw_sign,&nbsp;$private_key,&nbsp;'sha256WithRSAEncryption');\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$sign&nbsp;=&nbsp;base64_encode($raw_sign);\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;$sign;\n&nbsp;&nbsp;&nbsp;&nbsp;}\n&nbsp;&nbsp;&nbsp;&nbsp;\/\/\u9a8c\u8bc1\u7b7e\u540d\n&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;static&nbsp;function&nbsp;checkSign()\n&nbsp;&nbsp;&nbsp;&nbsp;{\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$header&nbsp;=&nbsp;Context::get('header');\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$serial_no&nbsp;=&nbsp;$header['wechatpay-serial']&nbsp;??&nbsp;'';&nbsp;\/\/\u5fae\u4fe1\u5e73\u53f0\u5e8f\u5217\u53f7\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$timeStamp&nbsp;=&nbsp;$header['wechatpay-timestamp']&nbsp;??&nbsp;'';\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$nonce&nbsp;=&nbsp;$header['wechatpay-nonce']&nbsp;??&nbsp;'';\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$body&nbsp;=&nbsp;Context::get('raw');\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$wx_sign&nbsp;=&nbsp;$header['wechatpay-signature']&nbsp;??&nbsp;'';\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$wx_serial_no&nbsp;=&nbsp;Action::config(CONFIG_WXXCX,&nbsp;'wx_serial_no');\/\/\u4fdd\u5b58\u7684\u5e8f\u5217\u53f7\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(!$serial_no&nbsp;||&nbsp;$wx_serial_no&nbsp;!=&nbsp;$serial_no)&nbsp;{\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sffLog::write('\u7b7e\u540d\u8fc7\u671f');\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;false;\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$message&nbsp;=&nbsp;$timeStamp&nbsp;.&nbsp;\"\n\"&nbsp;.\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$nonce&nbsp;.&nbsp;\"\n\"&nbsp;.\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$body&nbsp;.&nbsp;\"\n\";\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$wx_sign&nbsp;=&nbsp;base64_decode($wx_sign);\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$public_key&nbsp;=&nbsp;self::getPublicKey(BASE_PATH&nbsp;.&nbsp;'cert\/wx_public_cert.pem');&nbsp;\/\/\u5e73\u53f0\u516c\u94a5\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$res&nbsp;=&nbsp;openssl_verify($message,&nbsp;$wx_sign,&nbsp;$public_key,&nbsp;OPENSSL_ALGO_SHA256);\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;($res&nbsp;==&nbsp;1)&nbsp;{\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;true;\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sffLog::write('\u9a8c\u7b7e\u5931\u8d25');\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;false;\n&nbsp;&nbsp;&nbsp;&nbsp;}\n&nbsp;&nbsp;&nbsp;&nbsp;\/\/\u83b7\u53d6\u79c1\u94a5\n&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;static&nbsp;function&nbsp;getPrivateKey($filepath)\n&nbsp;&nbsp;&nbsp;&nbsp;{\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;openssl_get_privatekey(file_get_contents($filepath));\n&nbsp;&nbsp;&nbsp;&nbsp;}\n&nbsp;&nbsp;&nbsp;&nbsp;\/\/\u83b7\u53d6\u516c\u94a5\n&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;static&nbsp;function&nbsp;getPublicKey($filepath)\n&nbsp;&nbsp;&nbsp;&nbsp;{\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;openssl_pkey_get_public(file_get_contents($filepath));\n&nbsp;&nbsp;&nbsp;&nbsp;}\n&nbsp;&nbsp;&nbsp;&nbsp;\/\/\u52a0\u5bc6\u6570\u636e\n&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;static&nbsp;function&nbsp;getEncrypt($str)\n&nbsp;&nbsp;&nbsp;&nbsp;{\n\/\/$str\u662f\u5f85\u52a0\u5bc6\u5b57\u7b26\u4e32&nbsp;\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$public_key_path&nbsp;=&nbsp;BASE_PATH&nbsp;.&nbsp;'cert\/wx_public_cert.pem';&nbsp;\/\/'\u5e73\u53f0\u8bc1\u4e66\u8def\u5f84';\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$public_key&nbsp;=&nbsp;file_get_contents($public_key_path);\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$encrypted&nbsp;=&nbsp;'';\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(openssl_public_encrypt($str,&nbsp;$encrypted,&nbsp;$public_key,&nbsp;OPENSSL_PKCS1_OAEP_PADDING))&nbsp;{\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\/\/base64\u7f16\u7801&nbsp;\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$sign&nbsp;=&nbsp;base64_encode($encrypted);\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;else&nbsp;{\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;throw&nbsp;new&nbsp;Exception('encrypt&nbsp;failed');\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;$sign;\n&nbsp;&nbsp;&nbsp;&nbsp;}\n&nbsp;&nbsp;&nbsp;&nbsp;\/\/\u89e3\u5bc6\u6570\u636e\n&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;static&nbsp;function&nbsp;decryptToString($ciphertext,&nbsp;$associatedData,&nbsp;$nonceStr)\n&nbsp;&nbsp;&nbsp;&nbsp;{\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$aesKey&nbsp;=&nbsp;Action::config(CONFIG_WXXCX,&nbsp;'mch_keyv3');&nbsp;\/\/\u5546\u6237apiv3\u5bc6\u94a5\u89e3\u5bc6\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$str&nbsp;=&nbsp;base64_decode($ciphertext);\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(strlen($str)&nbsp;=&nbsp;PHP&nbsp;7.2)\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;sodium_crypto_aead_aes256gcm_decrypt($str,&nbsp;$associatedData,&nbsp;$nonceStr,&nbsp;$aesKey);\n&nbsp;&nbsp;&nbsp;&nbsp;}\n&nbsp;&nbsp;&nbsp;&nbsp;\/\/\u4e0b\u8f7d\u5e73\u53f0\u8bc1\u4e66\n&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;static&nbsp;function&nbsp;downCert()\n&nbsp;&nbsp;&nbsp;&nbsp;{\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$url&nbsp;=&nbsp;'https:\/\/api.mch.weixin.qq.com\/v3\/certificates';\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$re&nbsp;=&nbsp;self::wxCurl($url,&nbsp;[],&nbsp;'GET');\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(!isset($re['data']))&nbsp;{\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;api_fail('\u83b7\u53d6\u8bc1\u4e66\u5931\u8d25');\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$ciphertext&nbsp;=&nbsp;$re['data'][0]['encrypt_certificate']['ciphertext'];\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$associatedData&nbsp;=&nbsp;$re['data'][0]['encrypt_certificate']['associated_data'];\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$nonceStr&nbsp;=&nbsp;$re['data'][0]['encrypt_certificate']['nonce'];\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$data&nbsp;=&nbsp;self::decryptToString($ciphertext,&nbsp;$associatedData,&nbsp;$nonceStr);\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(!$data)&nbsp;{\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;api_fail('\u83b7\u53d6\u8bc1\u4e66\u89e3\u5bc6\u5931\u8d25');\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;file_put_contents(BASE_PATH&nbsp;.&nbsp;'\/cert\/wx_public_cert.pem',&nbsp;$data);\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;$data;\n&nbsp;&nbsp;&nbsp;&nbsp;}\n}<\/pre>\n<p> \u767b\u5f55\u540e\u590d\u5236 <\/p>\n<p>\u4ee5\u4e0a\u5c31\u662f\u5206\u4eab\u5fae\u4fe1\u652f\u4ed8v3\u7248 php\u89e3\u5bc6\u89e3\u5bc6\u4ee3\u7801\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>\u5fae\u4fe1\u652f\u4ed8v3\u7248\u672c\u5c0f\u7a0b\u5e8f\u652f\u4ed8 php\u7b7e\u540d,\u9a8c\u7b7e,\u6570\u636e\u89e3\u5bc6\u4ee3\u7801\u5206\u4eab \u5fae\u4fe1\u652f\u4ed8v3\u7248 php\u89e3\u5bc6\u89e3\u5bc6\u4ee3\u7801 \u6570\u636e\u89e3\u5bc6\u9700\u8981\u7528\u5230sodium\u6269\u5c55 \u5927\u90e8\u5206php\u7248\u672c\u9700\u8981\u5b89\u88c5 \u8bc1\u4e66\u5e8f\u5217\u53f7\u53ef\u4ee5\u5728\u8fd9\u91cc\u67e5\u770bhttps:\/\/myssl.com\/cert_decode.html \u6211\u7528\u7684php7.4\u7248\u672c \u7acb\u5373\u5b66\u4e60\u201c\u201d\uff1b \u76f4\u63a5\u4e0a\u4ee3\u7801: \/\/\u5fae\u4fe1\u539f\u751f\u652f\u4ed8 class&nbsp;Wxpay { &nbsp;&nbsp;&nbsp;&nbsp;\/* &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;\u652f\u4ed8(\u5c0f\u7a0b\u5e8f\u652f\u4ed8) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@param&nbsp;type&nbsp;$sn&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\u8ba2\u5355\u7f16\u53f7 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@param&nbsp;type&nbsp;$money&nbsp;&nbsp;\u91d1\u989d &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@param&nbsp;type&nbsp;$openid&nbsp;&nbsp;\u7528\u6237\u5c0f\u7a0b\u5e8fopenid &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@return&nbsp;type &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*\/ &nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;static&nbsp;function&nbsp;getPayParam($sn,&nbsp;$money,&nbsp;$openid) &nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$url&nbsp;=&nbsp;&#8216;https:\/\/api.mch.weixin.qq.com\/v3\/pay\/transactions\/jsapi&#8217;; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$notify_url&nbsp;=&nbsp;url(&#8216;\/api\/weixin\/notify&#8217;); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$data&nbsp;=&nbsp;[]; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$data[&#8216;appid&#8217;]&nbsp;=&nbsp;Action::config(CONFIG_WXXCX,&nbsp;&#8216;app_id&#8217;); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$data[&#8216;mchid&#8217;]&nbsp;=&nbsp;Action::config(CONFIG_WXXCX,&nbsp;&#8216;mchid&#8217;);&nbsp;\/\/\u5546\u6237\u53f7 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$data[&#8216;description&#8217;]&nbsp;=&nbsp;&#8216;xxx&#8217;;&nbsp;\/\/\u63cf\u8ff0\uff1f &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$data[&#8216;out_trade_no&#8217;]&nbsp;=&nbsp;$sn;&nbsp;\/\/\u5546\u6237\u7cfb\u7edf\u5185\u90e8\u8ba2\u5355\u53f7 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$data[&#8216;time_expire&#8217;]&nbsp;=&nbsp;date(&#8216;Y-m-d&#8217;)&nbsp;.&nbsp;&#8216;T&#8217;&nbsp;.&nbsp;date(&#8216;H:i:s&#8217;,&nbsp;(time()&nbsp;+&nbsp;1800))&nbsp;.&nbsp;&#8216;+08:00&#8217;;&nbsp;\/\/\u8ba2\u5355\u5931\u6548\u65f6\u95f42018-06-08T10:34:56+08:00 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$data[&#8216;notify_url&#8217;]&nbsp;=&nbsp;$notify_url;&nbsp;\/\/\u5f02\u6b65\u901a\u77e5\u63a5\u53e3\u5730\u5740 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$data[&#8216;amount&#8217;]&nbsp;=&nbsp;[&#8216;total&#8217;&nbsp;=&amp;gt;&nbsp;$money&nbsp;*&nbsp;100,&nbsp;&#8216;currency&#8217;&nbsp;=&amp;gt;&nbsp;&#8216;CNY&#8217;];&nbsp;\/\/\u91d1\u989d &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$data[&#8216;payer&#8217;]&nbsp;=&nbsp;[&#8216;openid&#8217;&nbsp;=&amp;gt;&nbsp;$openid];&nbsp;\/\/\u7528\u6237 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$re&nbsp;=&nbsp;self::wxCurl($url,&nbsp;$data,&nbsp;&#8216;POST&#8217;); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(!isset($re[&#8216;prepay_id&#8217;]))&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;api_fail(&#8216;\u53c2\u6570\u83b7\u53d6\u5931\u8d25&#8217;); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$result&nbsp;=&nbsp;[]; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$result[&#8216;appId&#8217;]&nbsp;=&nbsp;Action::config(CONFIG_WXXCX,&nbsp;&#8216;app_id&#8217;); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$result[&#8216;timeStamp&#8217;]&nbsp;=&nbsp;(string)time(); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$result[&#8216;nonceStr&#8217;]&nbsp;=&nbsp;uniqid(); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$result[&#8216;package&#8217;]&nbsp;=&nbsp;&#8216;prepay_id=&#8217;&nbsp;.&nbsp;$re[&#8216;prepay_id&#8217;]; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$result[&#8216;signType&#8217;]&nbsp;=&nbsp;&#8216;RSA&#8217;; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$result[&#8216;paySign&#8217;]&nbsp;=&nbsp;self::getPaySign($result); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;$result; &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;\/** &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;\u67e5\u8be2\u8ba2\u5355 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@param&nbsp;type&nbsp;$sn &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*\/ &nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;static&nbsp;function&nbsp;select($sn,&nbsp;$return&nbsp;=&nbsp;false) &nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$mchid&nbsp;=&nbsp;Action::config(CONFIG_WXXCX,&nbsp;&#8216;mchid&#8217;);&nbsp;\/\/\u5546\u6237\u53f7 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$url&nbsp;=&nbsp;&#8216;https:\/\/api.mch.weixin.qq.com\/v3\/pay\/transactions\/out-trade-no\/&#8217;&nbsp;.&nbsp;$sn&nbsp;.&nbsp;&#8216;?mchid=&#8217;&nbsp;.&nbsp;$mchid; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$re&nbsp;=&nbsp;self::wxCurl($url,&nbsp;[],&nbsp;&#8216;GET&#8217;); [&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-34027","post","type-post","status-publish","format-standard","hentry","category-19"],"_links":{"self":[{"href":"https:\/\/fwq.ai\/blog\/wp-json\/wp\/v2\/posts\/34027","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=34027"}],"version-history":[{"count":0,"href":"https:\/\/fwq.ai\/blog\/wp-json\/wp\/v2\/posts\/34027\/revisions"}],"wp:attachment":[{"href":"https:\/\/fwq.ai\/blog\/wp-json\/wp\/v2\/media?parent=34027"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fwq.ai\/blog\/wp-json\/wp\/v2\/categories?post=34027"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fwq.ai\/blog\/wp-json\/wp\/v2\/tags?post=34027"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}