1. 程式人生 > >PHP開發之微信H5支付

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&notify_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

phph5支付經驗之談

首先 先去商戶平臺申請開通 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開發中的支付功能,基本上所有的商城類專案都會用到微信支付,支付寶支付,相信很多初學者在開發的過程中也曾遇到跟我一樣的情況:看完開發文件之後,做出來的功能怎麼呼叫不起來,經過後來的反覆除錯才成功的完成支付功能,下面我就簡單的來說說微信支付和支