日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術(shù)文章
文章詳情頁

PHP JSAPI調(diào)支付API實(shí)現(xiàn)微信支付功能詳解

瀏覽:46日期:2022-06-05 17:42:25
目錄
  • 一、首先我們來填個(gè)坑
  • 二、代碼示例
    • 1.請求參數(shù)配置
    • 2.統(tǒng)一下單API
    • 3.MakeSign 簽名
    • 4.ToXml 數(shù)組參數(shù)轉(zhuǎn)xml
    • 5.postXmlCurl 發(fā)送請求
    • 6.FromXml 結(jié)果xml參數(shù)轉(zhuǎn)數(shù)組
    • 總結(jié)

一、首先我們來填個(gè)坑

支付驗(yàn)簽失敗

這個(gè)問題折磨了我兩天,官方文檔比較含糊不清。各種百度下來的方法試過之后也不盡人意,最后發(fā)現(xiàn)問題是沒有二次簽名

二次簽名需要參數(shù)(代碼會(huì)展示在哪里二次簽名):

appId: 商戶申請的公眾號(hào)對應(yīng)的appid(I大寫)

nonceStr: 隨機(jī)字符串(注意是JSAPI下單接口中返回的 nonce_str、不是重新生成)

package: 統(tǒng)一下單接口返回的prepay_id參數(shù)值 ,(注意格式prepay_id=wx.....)

signType: 簽名類型、(官方文檔)僅支持RSA。

(我的簽名類型是 HMAC-SHA256 也是可以的,必須和下單使用的簽名類型保持一致)

timeStamp:時(shí)間戳(這里要把 time() 轉(zhuǎn)成字符串類型)

注明:使用這五個(gè)參數(shù)生成的 paySign 簽名才是需要返給前端的(

官方文檔實(shí)例要計(jì)算簽名也給我整的蒙圈,最后發(fā)現(xiàn)直接將五個(gè)必須參數(shù)生成的簽名返給前端就可以直接調(diào)取API了

二、代碼示例

1.請求參數(shù)配置

		$oInput    = [			"body" => "測試商品",  // 商品說明			"attach"       => "測試場景",  // 自定義參數(shù):可以用來做回調(diào)后場景區(qū)分     			"out_trade_no" => "測試單號(hào)" . time(), // 自定義訂單號(hào)       			"total_fee"    => 1 * 100,   // 付款金額:記得*100 微信官方是以分為單位   			"goods_tag"    => "",// 優(yōu)惠券相關(guān)參數(shù)   			"notify_url"   => "http://...",     // 回調(diào)通知地址			"trade_type"   => "JSAPI",  // 支付方式			"openid"       => $openid,  // 付款用戶openid       // "profit_sharing" => "Y", // 是否分賬的標(biāo)識(shí)      		];		$res = $this->unifiedOrder($oInput);     // 這里我調(diào)用的統(tǒng)一下單		return $res;     // 返給前端帶APPID等參數(shù)給前端去調(diào)用支付

2.統(tǒng)一下單API

	public function unifiedOrder($inputObj, $timeOut = 6)	{		$url = "https://api.mch.weixin.qq.com/pay/unifiedorder";		// 首次簽名參數(shù)		$oValues = [			"body" 				=> $inputObj["body"],				// 設(shè)置商品或支付單簡要描述			"attach" 			=> $inputObj["attach"],				// 設(shè)置附加數(shù)據(jù),用于商戶攜帶訂單的自定義數(shù)據(jù)			"out_trade_no" 		=> $inputObj["out_trade_no"], 		// 設(shè)置商戶系統(tǒng)內(nèi)部的訂單號(hào),transaction_id、out_trade_no二選一,如果同時(shí)存在優(yōu)先級:transaction_id> out_trade_no			"total_fee" 		=> $inputObj["total_fee"], 			// 設(shè)置訂單總金額,只能為整數(shù),單位:分			"time_start" 		=> date("YmdHis"), 					// 設(shè)置訂單生成時(shí)間			"time_expire" 		=> date("YmdHis", time() + 600), 	// 設(shè)置訂單失效時(shí)間			"goods_tag" 		=> $inputObj["goods_tag"], 			// 設(shè)置商品標(biāo)記,代金券或立減優(yōu)惠功能的參數(shù)			"notify_url" 		=> $inputObj["notify_url"], 		// 獲取接收微信支付異步通知回調(diào)地址的值			"trade_type" 		=> $inputObj["trade_type"], 		// JSAPI,NATIVE,APP			"openid" 			=> $inputObj["openid"], 			// 用戶在商戶appid下的唯一標(biāo)識(shí)			//"profit_sharing" 	=> $inputObj["profit_sharing"],		// 是否需要分賬			"appid" 			=> "appid", 			    // app_id:替換真實(shí)的			"mch_id" 			=> "mchid", 			    // 商戶號(hào):替換真實(shí)的			"spbill_create_ip" 	=> $_SERVER["REMOTE_ADDR"], 		// 終端ip			"nonce_str" 		=> "自定義生成", 			// 隨機(jī)32位字符串			"sign_type" 		=> "HMAC-SHA256", 					// 簽名類型,自行替換		];		// 首次簽名		ksort($oValues);		$oValues["sign"] = $this->MakeSign($oValues); 		// 調(diào)用簽名		$xml = $this->ToXml($oValues);      // 數(shù)字轉(zhuǎn)xml類型		$response = self::postXmlCurl($xml, $url, false, $timeOut); // 請求		$result   = $this->FromXml($response);      // 請求結(jié)果從xml轉(zhuǎn)成數(shù)組類型// 二次簽名參數(shù)		$oResult    = [			"appId"     => $result["appid"],   // 首次請求中的appid			"nonceStr"  => $result["nonce_str"],       // 首次請求中的nonce_str			"package"   => "prepay_id=" . $result["prepay_id"],// 首次請求中的prepay_id			"signType"  => "HMAC-SHA256",   // 跟首次簽名中的簽名類型參數(shù)保持一致			"timeStamp" => (string)(time()),// 時(shí)間戳轉(zhuǎn)字符串類型		];// 二次簽名		$oResult["paySign"] = $this->MakeSign($oResult);    // 調(diào)用簽名		$result = json_encode($oResult); // encode數(shù)組		return $result;  // 直接返回	}

3.MakeSign 簽名

	/**	 * 生成簽名	 * @param bool $needSignType  是否需要補(bǔ)signtype	 * @return 簽名,本函數(shù)不覆蓋sign成員變量,如要設(shè)置簽名需要調(diào)用SetSign方法賦值	 */	public function MakeSign($values, $needSignType = true)	{		if ($needSignType) {			$sSignType = "HMAC-SHA256"; // 可以在文檔開頭用枚舉定義: 所有簽名類型必須一致		}		$sKey = "key";   // 獲取支付參數(shù)key		// 簽名步驟一:按字典序排序參數(shù)		ksort($values);		$string = $this->ToUrlParams($values);		// 簽名步驟二:在string后加入KEY		$string = $string . "&key=" . $sKey;		// 簽名步驟三:MD5加密或者HMAC-SHA256		if ($sSignType == "MD5") {			$string = md5($string);		} else if ($sSignType == "HMAC-SHA256") {			$string = hash_hmac("sha256", $string, $sKey);		} else {			return "簽名類型不支持!";		}		// 簽名步驟四:所有字符轉(zhuǎn)為大寫		$result = strtoupper($string);		return $result;	}

4.ToXml 數(shù)組參數(shù)轉(zhuǎn)xml

	public function ToXml($values)	{		if (!is_array($values) || count($values) <= 0) {			return "數(shù)組數(shù)據(jù)異常!";		}		$xml = "<xml>";		foreach ($values as $key => $val) {			if (is_numeric($val)) {				$xml .= "<" . $key . ">" . $val . "</" . $key . ">";			} else {				$xml .= "<" . $key . "><![CDATA[" . $val . "]]></" . $key . ">";			}		}		$xml .= "</xml>";		return $xml;	}

5.postXmlCurl 發(fā)送請求

	/**	 * 以post方式提交xml到對應(yīng)的接口url	 * 	 * @param WxPayConfigInterface $config  配置對象	 * @param string 	$xml  		需要post的xml數(shù)據(jù)	 * @param string 	$url  		url	 * @param bool 		$useCert 	是否需要證書,默認(rèn)不需要	 * @param int 		$second   	url執(zhí)行超時(shí)時(shí)間,默認(rèn)30s	 */	private function postXmlCurl($xml, $url, $useCert = false, $second = 30)	{		$ch 			= curl_init();		$curlVersion 	= curl_version();		$ua 			= "WXPaySDK/" . self::VERSION . " (" . PHP_OS . ") PHP/" . PHP_VERSION . " CURL/" . $curlVersion["version"] . " " . $aWxpayParam["mchid"];		//設(shè)置超時(shí)		curl_setopt($ch, CURLOPT_TIMEOUT, $second);		$proxyHost = "0.0.0.0";		$proxyPort = 0;		// 如果有配置代理這里就設(shè)置代理		if ($proxyHost != "0.0.0.0" && $proxyPort != 0) {			curl_setopt($ch, CURLOPT_PROXY, $proxyHost);			curl_setopt($ch, CURLOPT_PROXYPORT, $proxyPort);		}		curl_setopt($ch, CURLOPT_URL, $url);		// curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,TRUE);		// curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,2);//嚴(yán)格校驗(yàn)		curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);		curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE); //嚴(yán)格校驗(yàn)		curl_setopt($ch, CURLOPT_USERAGENT, $ua);		// 設(shè)置header		curl_setopt($ch, CURLOPT_HEADER, FALSE);		// 要求結(jié)果為字符串且輸出到屏幕上		curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);		if ($useCert == true) {			// 設(shè)置證書			// 使用證書:cert 與 key 分別屬于兩個(gè).pem文件			// 證書文件請放入服務(wù)器的非web目錄下			$sslCertPath 	= "sslCertPath";// 證書路徑			$sslKeyPath 	= "sslKeyPath"; // 證書路徑			curl_setopt($ch, CURLOPT_SSLCERTTYPE, "PEM");			curl_setopt($ch, CURLOPT_SSLCERT, $sslCertPath);			curl_setopt($ch, CURLOPT_SSLKEYTYPE, "PEM");			curl_setopt($ch, CURLOPT_SSLKEY, $sslKeyPath);		}		// post提交方式		curl_setopt($ch, CURLOPT_POST, TRUE);		curl_setopt($ch, CURLOPT_POSTFIELDS, $xml);		// 運(yùn)行curl		$data = curl_exec($ch);		// 返回結(jié)果		if ($data) {			curl_close($ch);			return $data;		} else {			$error = curl_errno($ch);			curl_close($ch);			throw new WxPayException("curl出錯(cuò),錯(cuò)誤碼:$error");		}	}

6.FromXml 結(jié)果xml參數(shù)轉(zhuǎn)數(shù)組

	/**	 * 將xml轉(zhuǎn)為array	 * @param string $xml	 * @throws WxPayException	 */	public function FromXml($xml)	{		if (!$xml) {			return "xml數(shù)據(jù)異常!";		}		//將XML轉(zhuǎn)為array		//禁止引用外部xml實(shí)體		libxml_disable_entity_loader(true);		$res = json_decode(json_encode(simplexml_load_string($xml, "SimpleXMLElement", LIBXML_NOCDATA)), true);		return $res;	}

總結(jié)

注意統(tǒng)一下單中五個(gè)調(diào)用方法別忘了:

getNonceStr:我沒貼出來,這個(gè)要自己寫(0.0)

MakeSign: 這里面的key要記得替換成自己真實(shí)的參數(shù)

ToXml

postXmlCurl : 注意這里面的證書要改成自己真實(shí)的哈

FromXml

到此這篇關(guān)于PHP JSAPI調(diào)支付API實(shí)現(xiàn)微信支付功能詳解的文章就介紹到這了,更多相關(guān)PHP微信支付內(nèi)容請搜索以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持!

標(biāo)簽: PHP
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
激情黄产视频在线免费观看| 欧美日一区二区| 久久亚洲图片| 亚洲综合不卡| 99视频精品| 爽好久久久欧美精品| 日韩一级不卡| 另类国产ts人妖高潮视频| 先锋影音国产一区| 四虎影视精品| 久久激情一区| 欧美va天堂在线| 美女久久网站| 日本aⅴ精品一区二区三区| 欧美亚洲国产日韩| 久久精品亚洲| 欧洲亚洲一区二区三区| 欧美在线亚洲综合一区| 亚洲伊人精品酒店| 国产美女撒尿一区二区| av资源中文在线| 好吊一区二区三区| 亚洲精品国模| 国产精品17p| 高清一区二区| 亚洲第一区色| 亚洲最大av| 国产精品分类| 日韩毛片在线| 中文字幕日本一区二区| 国产精品1luya在线播放| 日韩欧美一区二区三区免费观看| 日韩视频一区| 国产精品羞羞答答在线观看| 日韩不卡一区| 99视频在线精品国自产拍免费观看| 蜜臀av性久久久久蜜臀aⅴ四虎| 欧美日韩一区二区国产| 麻豆网站免费在线观看| 蜜臀久久99精品久久一区二区| 午夜亚洲一区| 国产精品亚洲综合在线观看| 日韩一区电影| 亚洲久久视频| 国产在线视频欧美一区| 伊人影院久久| 国产精品videossex| 久久男女视频| 日本欧美久久久久免费播放网| 国产精品xx| 蜜桃视频免费观看一区| 精品伊人久久久| 伊人久久成人| 美女在线视频一区| 不卡在线一区| 国产精品最新自拍| 激情久久久久久| 欧美精品观看| 午夜久久一区| 美女视频黄免费的久久| 一区福利视频| 日韩不卡一区| 91免费精品国偷自产在线在线| 99精品国产一区二区三区| 日本午夜精品久久久| 99精品电影| 精品欠久久久中文字幕加勒比| 先锋影音久久久| 伊人久久在线| 欧美亚洲免费| 伊人精品在线| 欧美一区久久久| 国产欧美啪啪| 蜜桃一区二区三区在线观看| 播放一区二区| 久久精品三级| 日韩高清一级| 夜夜嗨网站十八久久| 国产精品毛片一区二区在线看| 奇米色欧美一区二区三区| 欧美va天堂在线| 久久久久久一区二区| 日本麻豆一区二区三区视频| 国产一区久久| 久久精品国产网站| 蜜臀av亚洲一区中文字幕| 久久免费国产| 日本一区二区高清不卡| 国产免费播放一区二区| 亚洲精品激情| 久久亚洲电影| 欧美日韩国产传媒| 超级白嫩亚洲国产第一| 久久精品99久久久| 亚久久调教视频| 香蕉久久夜色精品国产| 欧美综合另类| 久久精品免费一区二区三区| 九九九精品视频| 国产精品一线| 日韩精品福利一区二区三区| 免播放器亚洲| 国产日韩综合| 欧美在线观看视频一区| 欧美freesex黑人又粗又大| 精品国产亚洲一区二区三区| 国产欧美88| 国产欧美日韩免费观看| 奇米777国产一区国产二区| 日韩在线成人| 亚洲aⅴ网站| 亚洲精品精选| 亚洲综合色婷婷在线观看| 亚洲综合另类| 伊人久久大香线蕉av超碰演员| 日韩精品一区二区三区免费观影| 成人av三级| 久久精品主播| 黄色成人在线网址| 亚洲免费婷婷| 综合激情在线| 日韩精品免费一区二区夜夜嗨 | 国产精品亚洲产品| 国产精品视频一区二区三区四蜜臂 | 91亚洲人成网污www| 精品久久一区| 国产成人久久精品麻豆二区| 久久精品系列| 国产aⅴ精品一区二区三区久久 | 国产精品传媒麻豆hd| 国产精品久久久久久久久免费高清| 国产欧美日韩精品一区二区免费| 国产精品第十页| 国产成人精品福利| 都市激情国产精品| 中文字幕在线官网| 在线日韩欧美| 亚洲欧美视频一区二区三区| 亚洲综合小说| 国产精品男女| 国产精品99在线观看| 狠狠躁少妇一区二区三区| 伊人网在线播放| 激情综合亚洲| 亚洲影视一区二区三区| 国产日韩一区二区三区在线 | 日韩精品一区二区三区免费观看| 久久免费高清| 免费日韩av片| 欧美日韩午夜| 在线天堂资源www在线污| 国产一区日韩欧美| 三级一区在线视频先锋| 日本不卡的三区四区五区| 欧美日一区二区在线观看| 精品国产乱码| 亚洲大全视频| 日韩在线电影| 国产一区二区三区黄网站| 不卡一区综合视频| 中文字幕视频精品一区二区三区| 国产精品白丝一区二区三区| 色一区二区三区四区| 欧美国产91| 亚洲精品免费观看| 精品黄色一级片| 香蕉人人精品| 91亚洲精品在看在线观看高清| 国产91在线播放精品| 日韩视频一区| 国产精品色婷婷在线观看| 久久九九99| 欧美一级久久| 久久在线免费| 国产亚洲久久| 天堂а√在线最新版中文在线| av不卡在线| 久久亚洲人体| 中文在线一区| 精品网站999| 日韩在线观看一区二区| 麻豆成人av在线| 久久亚洲不卡| 91亚洲国产成人久久精品| 中文字幕日韩亚洲| 日韩欧美视频专区| 日本99精品| 久久国产电影| 国产欧美日韩一级| 黄色成人91| 国产麻豆一区| 好看不卡的中文字幕| 另类小说一区二区三区| 另类亚洲自拍| 日韩欧美看国产| 欧美永久精品| 红桃视频国产精品| 都市激情国产精品| 奇米亚洲欧美| 99视频精品免费观看|