1. 程式人生 > >微信H5支付完整版含PHP回撥頁面.程式碼精簡2018年2月

微信H5支付完整版含PHP回撥頁面.程式碼精簡2018年2月

<?php $sj=date("Y-m-d H:i:s"); $userid=returnuserid($_SESSION["SHOPUSER"]); $uip=$_SERVER["REMOTE_ADDR"]; $money1=sqlzhuru($_POST[t1]); $bh=$ddbh=$_SESSION[h5_wx_ddbh]="h5wx_".time()."_uid".$userid; intotable("yjcode_dingdang","bh,ddbh,userid,sj,uip,money1,ddzt,alipayzt,bz,ifok,wxddbh","'".$bh."','"
.$ddbh."',".$userid.",'".$sj."','".$uip."',".$money1.",'等待買家付款','','微信充值',0,''");//如果入庫失敗,注意本檔案的編碼,中文可需要轉碼 //die(mysql_error()); $lib_path = dirname(__FILE__)."/"; $wechatconfig=require_once "H5.config.php"; $config = array( 'APPID' => $wechatconfig['APPID'], 'MCHID' => $wechatconfig
['MCHID'], 'KEY' => $wechatconfig['KEY'], 'APPSECRET' => $wechatconfig['APPSECRET'] , 'REDIRECT_URL'=>weburl.'m/user/', 'NOTIFY_URL' => weburl.'m/user/wxpay/h5_pay_notify.php', //非同步通知地址,收到微信通知後,可以修改根據情況訂單狀態為付款成功並增加會員餘額 ); $out_trade_no = $_SESSION['h5_wx_ddbh'];//訂單號.
while1("*","yjcode_dingdang where ddbh='".$out_trade_no."'"); $pay_order_data=mysql_fetch_array($res1); $notify_url = $config['NOTIFY_URL']; $wechatAppPay = new wechatAppPay($config['APPID'], $config['MCHID'], $notify_url, $config['KEY']); $params['body'] = iconv("GB2312//IGNORE","UTF-8",'充值中'); //注意檢測編碼.否則簽名很可失敗 $params['out_trade_no'] = $out_trade_no; $params['total_fee'] = $pay_order_data['money1'] * 100; $params['trade_type'] = 'MWEB'; $params['scene_info'] = '{"h5_info": {"type":"Wap","wap_url": "'.weburl.'","wap_name": "h5pay"}}'; $result = $wechatAppPay->unifiedOrder($params); //file_put_contents('3.txt', $result);//日誌 $url_encode_redirect_url = urlencode($config['REDIRECT_URL']); $url = $result['mweb_url'] . '&redirect_url=' . $url_encode_redirect_url; echo "<script>window.location.href='" . $url . "';</script>"; exit(); //以下為類檔案,不需要修改 /** * 微信支付伺服器端下單 * 微信APP支付文件地址: https://pay.weixin.qq.com/wiki/doc/api/app.php?chapter=8_6 * 使用示例 * 構造方法引數 * 'appid' => //填寫微信分配的公眾賬號ID * 'mch_id' => //填寫微信支付分配的商戶號 * 'notify_url'=> //填寫微信支付結果回撥地址 * 'key' => //填寫微信商戶支付金鑰 * ); * 統一下單方法 * $WechatAppPay = new wechatAppPay($options); * $params['body'] = '商品描述'; //商品描述 * $params['out_trade_no'] = '1217752501201407'; //自定義的訂單號,不能重複 * $params['total_fee'] = '100'; //訂單金額 只能為整數 單位為分 * $params['trade_type'] = 'APP'; //交易型別 JSAPI | NATIVE |APP | WAP * $wechatAppPay->unifiedOrder( $params ); */ class wechatAppPay { //介面API URL字首 const API_URL_PREFIX = 'https://api.mch.weixin.qq.com'; //下單地址URL const UNIFIEDORDER_URL = "/pay/unifiedorder";//微信官方的下單地址,不可修改 //查詢訂單URL const ORDERQUERY_URL = "/pay/orderquery"; //關閉訂單URL const CLOSEORDER_URL = "/pay/closeorder"; //公眾賬號ID private $appid; //商戶號 private $mch_id; //隨機字串 private $nonce_str; //簽名 private $sign; //商品描述 private $body; //商戶訂單號 private $out_trade_no; //支付總金額 private $total_fee; //終端IP private $spbill_create_ip; //支付結果回撥通知地址 private $notify_url; //交易型別 private $trade_type; //支付金鑰 private $key; //證書路徑 private $SSLCERT_PATH; private $SSLKEY_PATH; //所有引數 private $params = array(); public function __construct($appid, $mch_id, $notify_url, $key) { $this->appid = $appid; $this->mch_id = $mch_id; $this->notify_url = $notify_url; $this->key = $key; } /** * 下單方法 * @param $params 下單引數 */ public function unifiedOrder($params) { $this->body = $params['body']; $this->out_trade_no = $params['out_trade_no']; $this->total_fee = $params['total_fee']; $this->trade_type = $params['trade_type']; $this->scene_info = $params['scene_info']; $this->nonce_str = $this->genRandomString(); $this->spbill_create_ip = $this->get_client_ip(); $this->params['appid'] = $this->appid; $this->params['mch_id'] = $this->mch_id; $this->params['nonce_str'] = $this->nonce_str; $this->params['body'] = $this->body; $this->params['out_trade_no'] = $this->out_trade_no; $this->params['total_fee'] = $this->total_fee; $this->params['spbill_create_ip'] = $this->spbill_create_ip; $this->params['notify_url'] = $this->notify_url; $this->params['trade_type'] = $this->trade_type; $this->params['scene_info'] = $this->scene_info; //獲取簽名資料 //print_r($this->params); //如果簽名失敗,請到https://pay.weixin.qq.com/wiki/tools/signverify/ //填上相同引數.測試是哪個引數的變化導致簽名錯誤.本頁面需要谷歌瀏覽器開啟才行 $this->sign = $this->MakeSign($this->params); //print_r( "---");;print_r( $this->sign);exit; $this->params['sign'] = $this->sign; $xml = $this->data_to_xml($this->params); $response = $this->postXmlCurl($xml, self::API_URL_PREFIX . self::UNIFIEDORDER_URL); //print_r($response );exit; if (!$response) { return false; } $result = $this->xml_to_data($response); if (!empty($result['result_code']) && !empty($result['err_code'])) { $result['err_msg'] = $this->error_code($result['err_code']); } return $result; } /** * 將引數拼接為url: key=value&key=value * @param $params * @return string */ public function ToUrlParams($params) { //print_r($params); $string = ''; if (!empty($params)) { $array = array(); foreach ($params as $key => $value) { $array[] = $key . '=' . $value; } //print_r($array);exit; $string = implode("&", $array); //$string = str_replace("---","&" ,$string); // file_put_contents('1.txt',$string); } //print_r($string);exit; return $string; } /** * 生成簽名 * @return 簽名 */ public function MakeSign($params) { //簽名步驟一:按字典序排序陣列引數 ksort($params); $string = $this->ToUrlParams($params); //簽名步驟二:在string後加入KEY $string = $string . "&key=" . $this->key; //print_r($string);exit; // file_put_contents('4.txt', $string); //print_r($string);exit; //簽名步驟三:MD5加密 $string = md5($string); //簽名步驟四:所有字元轉為大寫 $result = strtoupper($string); return $result; } /** * @author:周洪亮<[email protected]>; * @copyright:2017/12/14; * @var:使用者真實ip地址 */ public function get_client_ip110000000000() { $cip = "unknown"; if ($_SERVER['REMOTE_ADDR']) { $cip = $_SERVER['REMOTE_ADDR']; } elseif (getenv("REMOTE_ADDR")) { $cip = getenv("REMOTE_ADDR"); } return $cip; } function get_client_ip() { if(getenv('HTTP_CLIENT_IP') && strcasecmp(getenv('HTTP_CLIENT_IP'), 'unknown')) { $ip = getenv('HTTP_CLIENT_IP'); } elseif(getenv('HTTP_X_FORWARDED_FOR') && strcasecmp(getenv('HTTP_X_FORWARDED_FOR'), 'unknown')) { $ip = getenv('HTTP_X_FORWARDED_FOR'); } elseif(getenv('REMOTE_ADDR') && strcasecmp(getenv('REMOTE_ADDR'), 'unknown')) { $ip = getenv('REMOTE_ADDR'); } elseif(isset($_SERVER['REMOTE_ADDR']) && $_SERVER['REMOTE_ADDR'] && strcasecmp($_SERVER['REMOTE_ADDR'], 'unknown')) { $ip = $_SERVER['REMOTE_ADDR']; } return preg_match ( '/[\d\.]{7,15}/', $ip, $matches ) ? $matches [0] : ''; } /** * 查詢訂單資訊 * @param $out_trade_no 訂單號 * @return array */ public function orderQuery($out_trade_no) { $this->params['appid'] = $this->appid; $this->params['mch_id'] = $this->mch_id; $this->params['nonce_str'] = $this->genRandomString(); $this->params['out_trade_no'] = $out_trade_no; //獲取簽名資料 $this->sign = $this->MakeSign($this->params); $this->params['sign'] = $this->sign; $xml = $this->data_to_xml($this->params); $response = $this->postXmlCurl($xml, self::API_URL_PREFIX . self::ORDERQUERY_URL); if (!$response) { return false; } $result = $this->xml_to_data($response); if (!empty($result['result_code']) && !empty($result['err_code'])) { $result['err_msg'] = $this->error_code($result['err_code']); } return $result; } /** * 關閉訂單 * @param $out_trade_no 訂單號 * @return array */ public function closeOrder($out_trade_no) { $this->params['appid'] = $this->appid; $this->params['mch_id'] = $this->mch_id; $this->params['nonce_str'] = $this->genRandomString(); $this->params['out_trade_no'] = $out_trade_no; //獲取簽名資料 $this->sign = $this->MakeSign($this->params); $this->params['sign'] = $this->sign; $xml = $this->data_to_xml($this->params); $response = $this->postXmlCurl($xml, self::API_URL_PREFIX . self::CLOSEORDER_URL); if (!$response) { return false; } $result = $this->xml_to_data($response); return $result; } /** * * 獲取支付結果通知資料 * return array */ public function getNotifyData() { //獲取通知的資料 $xml = $GLOBALS['HTTP_RAW_POST_DATA']; $data = array(); if (empty($xml)) { return false; } $data = $this->xml_to_data($xml); if (!empty($data['return_code'])) { if ($data['return_code'] == 'FAIL') { return false; } } return $data; } /** * 接收通知成功後應答輸出XML資料 * @param string $xml */ public function replyNotify() { $data['return_code'] = 'SUCCESS'; $data['return_msg'] = 'OK'; $xml = $this->data_to_xml($data); echo $xml; die(); } /** * 生成APP端支付引數 * @param $prepayid 預支付id */ public function getAppPayParams($prepayid) { $data['appid'] = $this->appid; $data['partnerid'] = $this->mch_id; $data['prepayid'] = $prepayid; $data['package'] = 'Sign=WXPay'; $data['noncestr'] = $this->genRandomString(); $data['timestamp'] = time(); $data['sign'] = $this->MakeSign($data); return $data; } /** * 輸出xml字元 * @param $params 引數名稱 * return string 返回組裝的xml **/ public function data_to_xml($params) { if (!is_array($params) || count($params) <= 0) { return false; } $xml = "<xml>"; foreach ($params as $key => $val) { if (is_numeric($val)) { $xml .= "<" . $key . ">" . $val . "</" . $key . ">"; } else { $xml .= "<" . $key . "><![CDATA[" . $val . "]]></" . $key . ">"; } } $xml .= "</xml>"; return $xml; } /** * 將xml轉為array * @param string $xml * return array */ public function xml_to_data($xml) { if (!$xml) { return false; } //將XML轉為array //禁止引用外部xml實體 libxml_disable_entity_loader(true); $data = json_decode(json_encode(simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOCDATA)), true); return $data; } /** * 獲取毫秒級別的時間戳 */ private static function getMillisecond() { //獲取毫秒的時間戳 $time = explode(" ", microtime()); $time = $time[1] . ($time[0] * 1000); $time2 = explode(".", $time); $time = $time2[0]; return $time; } /** * 產生一個指定長度的隨機字串,並返回給使用者 * @param type $len 產生字串的長度 * @return string 隨機字串 */ private function genRandomString($len = 32) { $chars = array( "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", ); $charsLen = count($chars) - 1; // 將陣列打亂 shuffle($chars); $output = ""; for ($i = 0; $i < $len; $i++) { $output .= $chars[mt_rand(0, $charsLen)]; } return $output; } /** * 以post方式提交xml到對應的介面url * * @param string $xml 需要post的xml資料 * @param string $url url * @param bool $useCert 是否需要證書,預設不需要 * @param int $second url執行超時時間,預設30s * @throws WxPayException */ private function postXmlCurl($xml, $url, $useCert = false, $second = 30) { $ch = curl_init(); //設定超時 curl_setopt($ch, CURLOPT_TIMEOUT, $second); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2); //設定header curl_setopt($ch, CURLOPT_HEADER, false); //要求結果為字串且輸出到螢幕上 curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); if ($useCert == true) { //設定證書 //使用證書:cert 與 key 分別屬於兩個.pem檔案 curl_setopt($ch, CURLOPT_SSLCERTTYPE, 'PEM'); //curl_setopt($ch,CURLOPT_SSLCERT, WxPayConfig::SSLCERT_PATH); curl_setopt($ch, CURLOPT_SSLKEYTYPE, 'PEM'); //curl_setopt($ch,CURLOPT_SSLKEY, WxPayConfig::SSLKEY_PATH); } //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); return false; } } /** * 錯誤程式碼 * @param $code 伺服器輸出的錯誤程式碼 * return string */ public function error_code($code) { $errList = array( 'NOAUTH' => '商戶未開通此介面許可權', 'NOTENOUGH' => '使用者帳號餘額不足', 'ORDERNOTEXIST' => '訂單號不存在', 'ORDERPAID' => '商戶訂單已支付,無需重複操作', 'ORDERCLOSED' => '當前訂單已關閉,無法支付', 'SYSTEMERROR' => '系統錯誤!系統超時', 'APPID_NOT_EXIST' => '引數中缺少APPID', 'MCHID_NOT_EXIST' => '引數中缺少MCHID', 'APPID_MCHID_NOT_MATCH' => 'appid和mch_id不匹配', 'LACK_PARAMS' => '缺少必要的請求引數', 'OUT_TRADE_NO_USED' => '同一筆交易不能多次提交', 'SIGNERROR' => '引數簽名結果不正確', 'XML_FORMAT_ERROR' => 'XML格式錯誤', 'REQUIRE_POST_METHOD' => '未使用post傳遞引數 ', 'POST_DATA_EMPTY' => 'post資料不能為空', 'NOT_UTF8' => '未使用指定編碼格式', ); if (array_key_exists($code, $errList)) { return $errList[$code]; } } } ?>

相關推薦

H5支付整版PHP頁面.程式碼精簡20182

<?php $sj=date("Y-m-d H:i:s"); $userid=returnuserid($_SESSION["SHOPUSER"]); $uip=$_SERVER["REMOTE_ADDR"]; $money1=sqlzhuru($_POST[t1]); $bh=$ddbh=$_SES

H5支付整版PHP頁面

注意事項: 一,微信H5支付只能用在手機瀏覽器中,比如百度瀏覽器,UC瀏覽器等,不可以用在微信中,微信中只可以使用公眾號支付.要特別注意. 二,如果你的h5手機版網站加殼打包封裝成了APP,根據我們的測試,也可以使用微信h5支付.不過.據微信官方說,可能會提示商家引數格式有誤,請聯絡商家解決

IOS第三方支付onResp方法不被的解決辦法

首先是關於關於IOS微信的支付分享或登入   成功調起客戶端操作之後,返回你的應用之後onResp:方法不被執行的問題。//這裡說明一下,上次的整合告訴大家在Appdelegate.m里加入如下兩個方

關於公眾號支付 H5支付APP支付的問題 (PHP)TP+VUE

話不多說 直接上原始碼 在寫支付之前一定要確定好微信要求配置的相關回調域名 安全支付域名還有雜七雜八的哪些地址都準備好了 要不然是沒法實現的 微信公眾平臺 微信商戶平臺 還有開發者平臺 什麼的 這點比較噁心 1.微信公眾號支付 公眾號支付和H5支付最大的不同就在於公眾號支付使用者有ope

Android通過外部瀏覽器呼叫H5支付,Android+PHP詳解

看了好多關於講解微信H5支付開發的文章,大多數都是通過微信內部瀏覽器來呼叫支付介面(其實就是公眾號支付),可能是因為H5支付介面剛開放不久吧。 微信官方體驗連結:http://wxpay.wxutil.com/mch/pay/h5.v2.php,請在

phph5支付經驗之談

首先 先去商戶平臺申請開通 H5支付。 官方是給我們提供了案例的大家可以移步檢視--->微信官方體驗連結:http://wxpay.wxutil.com/mch/pay/h5.v2.php,請在微信外瀏覽器開啟。 官方提供的流程,大家可以看看是不是你想要的樣子

PHP開發之H5支付

最近由於業務所需,對接了微信H5支付,然而微信支付對這塊並沒有現成的demo可用,所以就必須自己老老實實對照開發文件去寫咯!但這對於剛接觸的童鞋來說,坑多多少少還是有的,所以尋思著把自己的經驗分享出來,畢竟現成的用的還是多巴適的嘛! 好了,官方文件的那一套就不

php--H5支付

首先,我們說一下h5支付的應用場景! H5支付是指商戶在微信客戶端外的移動端網頁展示商品或服務,使用者在前述頁面確認使用微信支付時,商戶發起本服務呼起微信客戶端進行支付。 主要用於觸屏版的手機瀏覽器請

H5支付,看這個你一定就懂了【前端】

一、說在前面的話 1.微信H5支付一定要開通,沒開通就別扯淡了,它和APP支付不是一個 2.微信支付後臺一定要配置js安全域

H5支付 提示"網絡環境未能通過安全驗證,請稍後再試"

微信 h5 支付 按照官方https://pay.weixin.qq.com/wiki/doc/api/H5.php?chapter=15_4#接入微信的H5支付,提示“網絡環境未能通過安全驗證,請稍後再試”,經排查發現服務器有前端機子,原先獲取IP的方法有誤,不能正確獲取客戶的IP。更改獲取IP

H5支付開發全過程(除內置以外的瀏覽器)

app 獲取ip getenv 過程 comm ati psi 初始 cli 前言:網上都是~ 呵呵 自己搞 只要花時間 多問客服總會有的 只說程序不說準備工作 自己ID 或者秘鑰都準備好了 寫的有點兒亂 可以把所有的方法 放在一個文件中調用 public funct

h5支付demoH5支付demo非瀏覽器支付demowap支付

demo == tox tex h5支付 esp alt tsig openid 一、首先先確定H5支付權限已經申請!(需要微信h5支付demo的可以加 851 488 243 備註:h5支付) 二、開發流程 1、用戶在商戶側完成下單,使用微信支付進行支付 2、由商戶後臺向

H5支付,從第三方手機瀏覽器中直接打開支付頁面

pan 兩個 add field out 字典 註意 cti 返回 首先在商戶平臺通開H5支付功能,然後幫後綁定,支付完成之後需要跳轉的地址,開通之後就可以開發H5支付; 首先是簽名,臥槽,說到這個就想罵人, 官方文檔的解說;文科生哪能看得懂什麽是集合; 下面就來簽名:

***公眾號支付+H5支付+掃碼支付+小程序支付+APP支付解決方案總結

ati asc alt creat chapter edit 隨機字符串 glob 測試 最近負責的一些項目開發,都用到了微信支付(微信公眾號支付、微信H5支付、微信掃碼支付、APP微信支付)。在開發的過程中,在調試支付的過程中,或多或少都遇到了一些問題,今天總結下,分享,

h5支付

ref 單位 tps ech echo info str name ini <?php const APPID = ‘‘; //受理商ID,身份標識 const MCHID = ‘‘; //商戶支付密鑰Key。審

JavaH5支付實際例子

最近看過不少微信H5支付的例子,我是根據這個網址來配置的:https://blog.csdn.net/leigelg/article/details/80456758 這裡已經說的很明白,就是在支付的時候老是提示“網路環境未能通過安全驗證,請稍後重試”後來發現真是IP地址問題,這是我實際專案

H5支付開發(maven倉庫版)

官方文件:https://pay.weixin.qq.com/wiki/doc/api/H5.php?chapter=15_1 開發之前確認開通了H5支付功能 一、安裝微信sdk  二、建立config類 package com.xiuchefang.config; impo

java開發記錄-H5支付

一點點關於微信H5支付開發的總結. 接入成功後就可以進行程式碼設計啦. 此次測試開發是在springboot環境下完成的,下面列出微信支付用到的相關依賴: <dependency> <groupId>com.g

H5支付demo

首先我們必須得在微信公眾平臺和微信商業平臺那邊配置好相關配置 1、註冊微信服務號,開通微信支付許可權繫結微信商業平臺(這個具體怎麼操作我就不說了) 2、獲取應用(公眾號)appid、應用(公眾號)祕鑰、商戶號、商戶API祕鑰這四個配置資訊 3、微信商業平臺開通H5支付許可權,配置支付域名(是要ICP備案

Java整合H5支付/支付寶手機網站支付

微信H5支付:1,微信外部H5支付:名詞解釋:就是在自己的H5網站頁面裡呼叫微信支付功能,注意,這裡只能是在微信外部支付,在微信內開啟網站是無法支付的,要另外使用微信公眾號支付呼叫微信H5支付介面前提條件:1,註冊公眾號並且通過認證2,在公眾號裡申請微信支付,成為商戶號3,在