电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術文章
文章詳情頁

PHP JSAPI調支付API實現微信支付功能詳解

瀏覽:115日期:2022-06-05 17:42:25
目錄
  • 一、首先我們來填個坑
  • 二、代碼示例
    • 1.請求參數配置
    • 2.統一下單API
    • 3.MakeSign 簽名
    • 4.ToXml 數組參數轉xml
    • 5.postXmlCurl 發送請求
    • 6.FromXml 結果xml參數轉數組
    • 總結

一、首先我們來填個坑

支付驗簽失敗

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

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

appId: 商戶申請的公眾號對應的appid(I大寫)

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

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

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

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

timeStamp:時間戳(這里要把 time() 轉成字符串類型)

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

官方文檔實例要計算簽名也給我整的蒙圈,最后發現直接將五個必須參數生成的簽名返給前端就可以直接調取API了

二、代碼示例

1.請求參數配置

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

2.統一下單API

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

3.MakeSign 簽名

	/**	 * 生成簽名	 * @param bool $needSignType  是否需要補signtype	 * @return 簽名,本函數不覆蓋sign成員變量,如要設置簽名需要調用SetSign方法賦值	 */	public function MakeSign($values, $needSignType = true)	{		if ($needSignType) {			$sSignType = "HMAC-SHA256"; // 可以在文檔開頭用枚舉定義: 所有簽名類型必須一致		}		$sKey = "key";   // 獲取支付參數key		// 簽名步驟一:按字典序排序參數		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 "簽名類型不支持!";		}		// 簽名步驟四:所有字符轉為大寫		$result = strtoupper($string);		return $result;	}

4.ToXml 數組參數轉xml

	public function ToXml($values)	{		if (!is_array($values) || count($values) <= 0) {			return "數組數據異常!";		}		$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 發送請求

	/**	 * 以post方式提交xml到對應的接口url	 * 	 * @param WxPayConfigInterface $config  配置對象	 * @param string 	$xml  		需要post的xml數據	 * @param string 	$url  		url	 * @param bool 		$useCert 	是否需要證書,默認不需要	 * @param int 		$second   	url執行超時時間,默認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"];		//設置超時		curl_setopt($ch, CURLOPT_TIMEOUT, $second);		$proxyHost = "0.0.0.0";		$proxyPort = 0;		// 如果有配置代理這里就設置代理		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);//嚴格校驗		curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);		curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE); //嚴格校驗		curl_setopt($ch, CURLOPT_USERAGENT, $ua);		// 設置header		curl_setopt($ch, CURLOPT_HEADER, FALSE);		// 要求結果為字符串且輸出到屏幕上		curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);		if ($useCert == true) {			// 設置證書			// 使用證書:cert 與 key 分別屬于兩個.pem文件			// 證書文件請放入服務器的非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);		// 運行curl		$data = curl_exec($ch);		// 返回結果		if ($data) {			curl_close($ch);			return $data;		} else {			$error = curl_errno($ch);			curl_close($ch);			throw new WxPayException("curl出錯,錯誤碼:$error");		}	}

6.FromXml 結果xml參數轉數組

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

總結

注意統一下單中五個調用方法別忘了:

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

MakeSign: 這里面的key要記得替換成自己真實的參數

ToXml

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

FromXml

到此這篇關于PHP JSAPI調支付API實現微信支付功能詳解的文章就介紹到這了,更多相關PHP微信支付內容請搜索以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持!

標簽: PHP
主站蜘蛛池模板: 拉曼光谱仪_便携式|激光|显微共焦拉曼光谱仪-北京卓立汉光仪器有限公司 | 风化石头制砂机_方解石制砂机_瓷砖石子制砂机_华盛铭厂家 | 臭氧发生器_臭氧消毒机 - 【同林品牌 实力厂家】 | 家德利门业,家居安全门,别墅大门 - 安徽家德利门业有限公司 | 洁净实验室工程-成都手术室净化-无尘车间装修-四川华锐净化公司-洁净室专业厂家 | 运动木地板厂家,篮球场木地板品牌,体育场馆木地板安装 - 欧氏运动地板 | 不锈钢法兰-碳钢法兰-法兰盘生产加工厂家-[鼎捷峰]-不锈钢法兰-碳钢法兰-法兰盘生产加工厂家-[鼎捷峰] | DDoS安全防护官网-领先的DDoS安全防护服务商| 制冷采购电子商务平台——制冷大市场 | 北京网站建设公司_北京网站制作公司_北京网站设计公司-北京爱品特网站建站公司 | 钢骨架轻型板_膨石轻型板_钢骨架轻型板价格_恒道新材料 | 全自动翻转振荡器-浸出式水平振荡器厂家-土壤干燥箱价格-常州普天仪器 | 好看的韩国漫画_韩漫在线免费阅读-汗汗漫画 | 铝板冲孔网,不锈钢冲孔网,圆孔冲孔网板,鳄鱼嘴-鱼眼防滑板,盾构走道板-江拓数控冲孔网厂-河北江拓丝网有限公司 | 新型游乐设备,360大摆锤游乐设备「诚信厂家」-山东方鑫游乐设备 新能源汽车电池软连接,铜铝复合膜柔性连接,电力母排-容发智能科技(无锡)有限公司 | 进口消泡剂-道康宁消泡剂-陶氏消泡剂-大洋消泡剂 | 专业生物有机肥造粒机,粉状有机肥生产线,槽式翻堆机厂家-郑州华之强重工科技有限公司 | 最新电影-好看的电视剧大全-朝夕电影网 | 手板-手板模型-手板厂-手板加工-生产厂家,[东莞创域模型] | 影像测量仪_三坐标测量机_一键式二次元_全自动影像测量仪-广东妙机精密科技股份有限公司 | 电杆荷载挠度测试仪-电杆荷载位移-管桩测试仪-北京绿野创能机电设备有限公司 | 湖南印刷厂|长沙印刷公司|画册印刷|挂历印刷|台历印刷|杂志印刷-乐成印刷 | 嘉兴泰东园林景观工程有限公司_花箱护栏| uv固化机-丝印uv机-工业烤箱-五金蚀刻机-分拣输送机 - 保定市丰辉机械设备制造有限公司 | 浙江建筑资质代办_二级房建_市政_电力_安许_劳务资质办理公司 | 免费B2B信息推广发布平台 - 推发网 | MVR蒸发器厂家-多效蒸发器-工业废水蒸发器厂家-康景辉集团官网 | 杰福伦_磁致伸缩位移传感器_线性位移传感器-意大利GEFRAN杰福伦-河南赉威液压科技有限公司 | 黑田精工电磁阀-CAMMOZI气缸-ROSS电磁-上海茂硕机械设备有限公司 | 航空铝型材,7系铝型材挤压,硬质阳*氧化-余润铝制品 | 语料库-提供经典范文,文案句子,常用文书,您的写作得力助手 | 沥青灌缝机_路面灌缝机_道路灌缝机_沥青灌缝机厂家_济宁萨奥机械有限公司 | 马尔表面粗糙度仪-MAHR-T500Hommel-Mitutoyo粗糙度仪-笃挚仪器 | 航拍_专业的无人机航拍摄影门户社区网站_航拍网 | 浙江华锤电器有限公司_地磅称重设备_防作弊地磅_浙江地磅售后维修_无人值守扫码过磅系统_浙江源头地磅厂家_浙江工厂直营地磅 | 不锈钢法兰-碳钢法兰-法兰盘生产加工厂家-[鼎捷峰]-不锈钢法兰-碳钢法兰-法兰盘生产加工厂家-[鼎捷峰] | 贵州自考_贵州自学考试网| 防爆电机生产厂家,YBK3电动机,YBX3系列防爆电机,YBX4节防爆电机--河南省南洋防爆电机有限公司 | 微妙网,专业的动画师、特效师、CG模型设计师网站! - wmiao.com 超声波电磁流量计-液位计-孔板流量计-料位计-江苏信仪自动化仪表有限公司 | 领袖户外_深度旅游、摄影旅游、小团慢旅行、驴友网 | 液氮罐_液氮容器_自增压液氮罐_杜瓦瓶_班德液氮罐厂家 |