PHP開發之微信H5支付
最近由於業務所需,對接了微信H5支付,然而微信支付對這塊並沒有現成的demo可用,所以就必須自己老老實實對照開發文件去寫咯!但這對於剛接觸的童鞋來說,坑多多少少還是有的,所以尋思著把自己的經驗分享出來,畢竟現成的用的還是多巴適的嘛!
好了,官方文件的那一套就不多說了,詳情見官方文件。
在這裡,我主要分成了三個檔案:WxPay.Config.php(支付配置檔案)、Weixin.class.php(支付類)以及PayMentController.class.php(支付檔案)。
首先,WxPay.Config.php配置檔案主要包含了商戶appId、商戶號、商家key、非同步回撥URL、支付場景資訊,如下:
class WxPayConfig
{
public static $appid = '微信支付的公眾號appid';
public static $mchid = '微信支付分配的商戶號';
public static $key = '微信商戶自己設定的安全key';
public static $notify_url = '商戶側接收微信支付非同步通知的URL';
public static $scene_info = '{"h5_info":{"type":"Wap","wap_url":" 發起微信H5支付H5的URL","wap_name":"支付"}}' ;
}
然後,封裝Weixin.class.php支付類,主要呼叫統一下單Api,這裡不多說了,直接上程式碼:
<?php
require_once "lib/WxPay.Config.php";
class Weixin
{
/**
* 微信H5下單付款
* @order 付款資訊
* @bodys 付款內容
* */
function getCode($order,$bodys){
$url = "https://api.mch.weixin.qq.com/pay/unifiedorder" ;//微信傳參地址
//1.獲取呼叫統一下單介面所需必備引數
$appid =WxPayConfig::$appid;//微信公眾號appid
$mch_id = WxPayConfig::$mchid;//微信支付商戶號
$key = WxPayConfig::$key;//自己設定的微信商家key
$out_trade_no = $order['order_sn'];//平臺內部訂單號
$nonce_str=MD5($out_trade_no);//隨機字串
$body = $bodys;//付款內容
$total_fee = $order['order_amount']*100;//付款金額,單位為分
$spbill_create_ip = getIP(); //獲得使用者裝置IP
$attach = 'weixinh5';//附加資料(自定義,在支付通知中原樣返回)
$notify_url = WxPayConfig::$notify_url; //非同步回撥地址,需外網可以直接訪問
$trade_type = 'MWEB';//交易型別,微信H5支付時固定為MWEB
$scene_info =WxPayConfig::$scene_info;//場景資訊
//2.將引數按照key=value的格式,並按照引數名ASCII字典序排序生成字串
$signA ="appid=$appid&attach=$attach&body=$body&mch_id=$mch_id&nonce_str=$nonce_str¬ify_url=$notify_url&out_trade_no=$out_trade_no&scene_info=$scene_info&spbill_create_ip=$spbill_create_ip&total_fee=$total_fee&trade_type=$trade_type";
//3.拼接字串
$strSignTmp = $signA."&key=$key";
//4.MD5加密後轉換成大寫
$sign = strtoupper(MD5($strSignTmp));
//5.拼接成所需XML格式
$post_data = "<xml>
<appid>$appid</appid>
<attach>$attach</attach>
<body>$body</body>
<mch_id>$mch_id</mch_id>
<nonce_str>$nonce_str</nonce_str>
<notify_url>$notify_url</notify_url>
<out_trade_no>$out_trade_no</out_trade_no>
<spbill_create_ip>$spbill_create_ip</spbill_create_ip>
<total_fee>$total_fee</total_fee>
<trade_type>$trade_type</trade_type>
<scene_info>$scene_info</scene_info>
<sign>$sign</sign>
</xml>";
//6.以POST方式向微信傳參,並取得微信返回的支付引數
$dataxml = httpRequest($url,'POST',$post_data);
$objectxml = (array)simplexml_load_string($dataxml, 'SimpleXMLElement', LIBXML_NOCDATA); //將微信返回的XML轉換成陣列
return $objectxml;
}
}
最後,PayMentController.class.php支付檔案,支付檔案接收前端發起支付的請求並處理後,呼叫Weixin.class.php支付類並接受結果後返回給前端(此處分享已經去掉介面驗證等系列程式碼邏輯):
public function getPay(){
//1.引入支付類檔案
include_once "plugins/Payment/weixin/Weixin.class.php";
$payment = new \Weixin();
$order_id = I('order_id');
//2.判斷引數是否為空
if (!empty($order_id)){
//3.根據訂單id查詢訂單是否存在
$order = M('Order')->where(array('id'=>$order_id))->find();
if ($order){//訂單存在
//4.判斷該筆訂單是否已經支付,如已支付則返回支付失敗並給出相應提示
if ($order['pay_status'] == '1'){
exit(json_encode(array('status'=>'205','msg'=>'該訂單已支付,請勿重複提交!')));
}
$bodys = '訂單:'.$order['order_sn'] . '支付';
//5.呼叫支付類中封裝的支付方法並對應傳參
$result = $payment->getCode($order,$bodys);
//6.當return_code和result_code均為SUCCESS,代表下單成功,將支付引數返回
if($result['return_code'] == 'SUCCESS'){
if($result['result_code'] == 'SUCCESS'){
exit(json_encode(array('status'=>'0','msg'=>'下單成功,請支付!','result'=>$result['mweb_url'])));
}elseif($result['result_code'] == 'FAIL'){
exit(json_encode(array('status'=>'-201','msg'=>$result['err_code_des'])));
}
}else{
exit(json_encode(array('status'=>'-1','msg'=>'未知錯誤,請稍後重試!')));
}
}else{
//報錯:資料不存在
exit(json_encode(array('status'=>'-200','msg'=>'訂單不存在,請核實後再提交!')));
}
}else{
//報錯:缺少引數
exit(json_encode(array('status'=>'-204','msg'=>'引數缺失,請核實!')));
}
}
前端在接收到支付URL後執行即可喚醒微信支付。
附一:獲取使用者終端裝置ip方法
function getIP(){
if (getenv("HTTP_CLIENT_IP"))
$ip = getenv("HTTP_CLIENT_IP");
else if(getenv("HTTP_X_FORWARDED_FOR"))
$ip = getenv("HTTP_X_FORWARDED_FOR");
else if(getenv("REMOTE_ADDR"))
$ip = getenv("REMOTE_ADDR");
else $ip = "Unknow";
return $ip;
}
######附二:CURL請求方法
/**
* CURL請求
* @param $url 請求url地址
* @param $method 請求方法 get post
* @param null $postfields post資料陣列
* @param array $headers 請求header資訊
* @param bool|false $debug 除錯開啟 預設false
* @return mixed
*/
function httpRequest($url, $method, $postfields = null, $headers = array(), $debug = false) {
$method = strtoupper($method);
$ci = curl_init();
/* Curl settings */
curl_setopt($ci, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_0);
curl_setopt($ci, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows NT 6.2; WOW64; rv:34.0) Gecko/20100101 Firefox/34.0");
curl_setopt($ci, CURLOPT_CONNECTTIMEOUT, 60); /* 在發起連線前等待的時間,如果設定為0,則無限等待 */
curl_setopt($ci, CURLOPT_TIMEOUT, 7); /* 設定cURL允許執行的最長秒數 */
curl_setopt($ci, CURLOPT_RETURNTRANSFER, true);
switch ($method) {
case "POST":
curl_setopt($ci, CURLOPT_POST, true);
if (!empty($postfields)) {
$tmpdatastr = is_array($postfields) ? http_build_query($postfields) : $postfields;
curl_setopt($ci, CURLOPT_POSTFIELDS, $tmpdatastr);
}
break;
default:
curl_setopt($ci, CURLOPT_CUSTOMREQUEST, $method); /* //設定請求方式 */
break;
}
$ssl = preg_match('/^https:\/\//i',$url) ? TRUE : FALSE;
curl_setopt($ci, CURLOPT_URL, $url);
if($ssl){
curl_setopt($ci, CURLOPT_SSL_VERIFYPEER, FALSE); // https請求 不驗證證書和hosts
curl_setopt($ci, CURLOPT_SSL_VERIFYHOST, FALSE); // 不從證書中檢查SSL加密演算法是否存在
}
curl_setopt($ci, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ci, CURLOPT_MAXREDIRS, 2);/*指定最多的HTTP重定向的數量,這個選項是和CURLOPT_FOLLOWLOCATION一起使用的*/
curl_setopt($ci, CURLOPT_HTTPHEADER, $headers);
curl_setopt($ci, CURLINFO_HEADER_OUT, true);
$response = curl_exec($ci);
$requestinfo = curl_getinfo($ci);
if ($debug) {
echo "=====post data======\r\n";
var_dump($postfields);
echo "=====info===== \r\n";
print_r($requestinfo);
echo "=====response=====\r\n";
print_r($response);
}
curl_close($ci);
return $response;
}
好了,一點點菜鳥心得,有不當之處歡迎留言指證交流,一起成長,喵,就是這樣!
相關推薦
PHP開發之微信H5支付
最近由於業務所需,對接了微信H5支付,然而微信支付對這塊並沒有現成的demo可用,所以就必須自己老老實實對照開發文件去寫咯!但這對於剛接觸的童鞋來說,坑多多少少還是有的,所以尋思著把自己的經驗分享出來,畢竟現成的用的還是多巴適的嘛! 好了,官方文件的那一套就不
PHP開發之微信公眾號中進行支付寶支付
想必很多人都有過要在微信公眾號中進行支付寶支付的經歷,但是微信又遮蔽了阿里系所有的東西,網上百度了很多,都沒有完整的解決方案,可謂萬坑叢中過啊。剛剛踩完坑的袁小威就迫不及待的分享給大家咯。 切入正題,其實支付寶官方就微信公眾號中使用支付寶支付是
java開發記錄-微信H5支付
一點點關於微信H5支付開發的總結. 接入成功後就可以進行程式碼設計啦. 此次測試開發是在springboot環境下完成的,下面列出微信支付用到的相關依賴: <dependency> <groupId>com.g
php 微信開發之 微信支付 v3 配置
公司需要微信支付現不到鎮的是非常的麻煩。然後呢那個要怎麼申請我就不寫了。因為不是我負責的所以我就記錄微信支付開發就好了。自己也記錄一下以後要開發好下手 。 1. 到這裡下載sdk 版本本V3 : http
微信H5支付開發全過程(除內置微信以外的瀏覽器)
app 獲取ip getenv 過程 comm ati psi 初始 cli 前言:網上都是~ 呵呵 自己搞 只要花時間 多問客服總會有的 只說程序不說準備工作 自己ID 或者秘鑰都準備好了 寫的有點兒亂 可以把所有的方法 放在一個文件中調用 public funct
PHP 雜談《微信H5棋牌牛牛源碼搭建租售平臺》之 重新組織你的函數
調用方法 本體 微信 分享圖片 味道 rep color 一段 常用 微信H5棋牌牛牛源碼搭建租售平臺原文地址:http://h5.fanshubbs.com 聯系方式Q1687054422思維導圖 點擊下圖,可以看大圖。 介紹 我把我比較喜歡的和比較關註的地方寫下來和大
關於微信公眾號支付 微信H5支付和微信APP支付的問題 (PHP)TP+VUE
話不多說 直接上原始碼 在寫支付之前一定要確定好微信要求配置的相關回調域名 安全支付域名還有雜七雜八的哪些地址都準備好了 要不然是沒法實現的 微信公眾平臺 微信商戶平臺 還有開發者平臺 什麼的 這點比較噁心 1.微信公眾號支付 公眾號支付和H5支付最大的不同就在於公眾號支付使用者有ope
微信H5支付完整版含PHP回撥頁面
注意事項: 一,微信H5支付只能用在手機瀏覽器中,比如百度瀏覽器,UC瀏覽器等,不可以用在微信中,微信中只可以使用公眾號支付.要特別注意. 二,如果你的h5手機版網站加殼打包封裝成了APP,根據我們的測試,也可以使用微信h5支付.不過.據微信官方說,可能會提示商家引數格式有誤,請聯絡商家解決
微信H5支付開發(maven倉庫版)
官方文件:https://pay.weixin.qq.com/wiki/doc/api/H5.php?chapter=15_1 開發之前確認開通了H5支付功能 一、安裝微信sdk 二、建立config類 package com.xiuchefang.config; impo
php微信公眾號開發之微信企業付款給個人
/*微信企業付款給個人*/ <!--具體細節參考微信支付開發文件--> <!--引數 $openid個人openid,$re_user_name個人真實姓名,$amount付款金額,$partner_trade_no商戶訂單號,$desc描述--> &
Android通過外部瀏覽器呼叫微信H5支付,Android+PHP詳解
看了好多關於講解微信H5支付開發的文章,大多數都是通過微信內部瀏覽器來呼叫支付介面(其實就是公眾號支付),可能是因為H5支付介面剛開放不久吧。 微信官方體驗連結:http://wxpay.wxutil.com/mch/pay/h5.v2.php,請在
微信H5支付開發指南
最近在QQ交流群看到,很多微信小白在問微信H5開發,怎麼開發的問題。 對這個問題,根據我個人經驗進行了一個必要條件的梳理,總結如下: 1. 必須具備備案的域名以及公網IP 2. 登入微信公眾平臺進入“公眾號設定”的“功能設定”裡填寫“JS介面安全域名“ 3. ap
php微信h5支付經驗之談
首先 先去商戶平臺申請開通 H5支付。 官方是給我們提供了案例的大家可以移步檢視--->微信官方體驗連結:http://wxpay.wxutil.com/mch/pay/h5.v2.php,請在微信外瀏覽器開啟。 官方提供的流程,大家可以看看是不是你想要的樣子
微信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=$_SES
微信公眾號開發之微信支付開發
微信公眾號開發對接,開發文件也有蠻多坑,所以一路的血淚教訓,這次先針對微信支付整理一下支付的踩坑全過程,開發時間緊現在整理出來,既是對此段時間的學習總結,也希望對遇到同樣問題的童鞋可以有參考價值。 1. 微信掃碼支付 認證微信服務號,申請開通微信支付功能,獲取到微信支付
微信小程式開發之微信支付(三)微信下單
在發起支付之前,後臺會生成商戶訂單,呼叫統一下單API,得到預支付資訊。我是使用的是這個SDKcom.github.binarywang.wxpay.bean.notify.WxPayOrderNotifyResult; //統一下單返回結果類com.github.b
支付開發(二)----微信支付開發之微信公眾號支付JAVA版
一、開通微信公眾號 1.1公眾平臺帳號型別 微信公眾平臺分為服務號、企業號、訂閱號。 1、訂閱號:主要偏於為使用者傳達資訊(類似報紙雜誌),認證前後都是每天只可以群發一條訊息; 2、服務號:主要
微信小程式開發之微信支付(二)獲取openID
openID是微信使用者的唯一標識。我們通過從前端傳來的 code 呼叫登入API獲取openID和session_key。這個過程想必已經有很多例子。接下來我會介紹一種通過現成的SDK來實現。首先需要大家熟悉它。在下面的講解中,我會指出所用到的類和方法 cn.binaryw
php--微信H5支付
首先,我們說一下h5支付的應用場景! H5支付是指商戶在微信客戶端外的移動端網頁展示商品或服務,使用者在前述頁面確認使用微信支付時,商戶發起本服務呼起微信客戶端進行支付。 主要用於觸屏版的手機瀏覽器請
Android開發之微信支付,支付寶支付
今天想跟大家分享一下Android開發中的支付功能,基本上所有的商城類專案都會用到微信支付,支付寶支付,相信很多初學者在開發的過程中也曾遇到跟我一樣的情況:看完開發文件之後,做出來的功能怎麼呼叫不起來,經過後來的反覆除錯才成功的完成支付功能,下面我就簡單的來說說微信支付和支