esaywechat 微信公眾號jsapi支付

esaywechat 對應各框架版本

laravel =》overtrue/laravel-wechat

tp =》 naixiaoxin/think-wechat

yii 和 symfony等等

以laravel 為例

//安裝
composer require "overtrue/laravel-wechat:~4.0"

在 config/app.php 注冊 ServiceProvider 和 Facade (Laravel 5.5 無需手動注冊)

"providers" => [
    // ...
    Overtrue\LaravelWeChat\ServiceProvider::class,
],
"aliases" => [
    // ...
    "EasyWeChat" => Overtrue\LaravelWeChat\Facade::class,
],

創建配置文件:

php artisan vendor:publish --provider="Overtrue\LaravelWeChat\ServiceProvider"

修改應用根目錄下的 config/wechat.php 中對應的參數即可。
參數在微信公眾平臺配置和查看
同時設置號 域名 白名單 等
demo
/*
     * 公眾號
     */
。。。。
    "official_account" => [
        "default" => [
            "app_id" => env("WECHAT_OFFICIAL_ACCOUNT_APPID", "wxe4f459877777"),         // AppID
            "secret" => env("WECHAT_OFFICIAL_ACCOUNT_SECRET", "2323233uewuwuewueyue"),    // 
            "token" => env("WECHAT_OFFICIAL_ACCOUNT_TOKEN", "weee"),           // Token
            "aes_key" => env("WECHAT_OFFICIAL_ACCOUNT_AES_KEY", "23333333"),
            /*
             * OAuth 配置
             *
             * scopes:公眾平臺(snsapi_userinfo / snsapi_base),開放平臺:snsapi_login
             * callback:OAuth授權完成后的回調頁地址(如果使用中間件,則隨便填寫。。。)
             */
            // ],
        ],
    ],
。。。。。
//支付所需參數 微信商家平臺里獲取對應參數
    "pay_config" => [
            // 必要配置
            "app_id" => "同上",
            "mch_id" => "368779###",
            "secret" => "3b1e348d68610d07wqwqwqw3ee",
            "key"    => "ecipa2018wxhuwqwqwqw0",   // API 密鑰
            // 如需使用敏感接口(如退款、發送紅包等)需要配置 API 證書路徑(登錄商戶平臺下載 API 證書)
            "cert_path" => "../cert/apiclient_cert.pem", // XXX: 絕對路徑!!!!
            "key_path"  => "../cert/apiclient_key.pem",      // XXX: 絕對路徑!!!!
            //"notify_url" => "http://".$_SERVER["HTTP_HOST"]."/api/WeChatNotify",     // 默認的訂單回調地址,你也可以在下單時單獨設置來想覆蓋它
            //其他參數
    ],
證書 微信公眾平臺有下載地址
···

配置完成后

開始使用

use EasyWeChat\Kernel\Exceptions\InvalidConfigException;
use EasyWeChat\Payment\Kernel\BaseClient;
use EasyWeChat\Factory;
...
//用戶點擊支付 生成預支付訂單
public function PrepayOrder(Request $request,$order_sn) {
....
$config = config("wechat.pay_config");
$app = Factory::payment($config);
$jssdk = $app->jssdk;
//微信以分為單位 注意訂單價格
$actualPrice = $order["actual_price"]*100;
           //生成預付單
           $host = $_SERVER["HTTP_HOST"];
            try {
                $result = $app->order->unify([
                    "body" => $order["name"],
                    "out_trade_no" => $order["order_sn"],
                    "total_fee" => $actualPrice,//todo
                    "attach" => $order["id"],
                    "spbill_create_ip" => "", // 可選,如不傳該參數,SDK 將會自動獲取相應 IP 地址
                    //"notify_url" => $config["notify_url"], // 支付結果通知網址,如果不設置則會使用配置里的默認地址
                    "notify_url" => "http://".$_SERVER["HTTP_HOST"]."/api/WeChatNotify",
                    "trade_type" => "JSAPI",//支付方式
                    "openid" => $openid,
                ]);
            } catch (InvalidConfigException $e) {
            }
            //預支付訂單號prepayId, 生成支付 JS 配置
           $prepayId = $result["prepay_id"];
           $jsApiParameters = $jssdk->bridgeConfig($prepayId);
        $arr = [
            "error"=>0,
            "jsApiParameters"=>$jsApiParameters,
        ];
        return $arr;
 //頁面調起微信支付js
<script src="{{ asset("jq/jquery-1.11.3.min.js") }}"></script>
<script>
//下單
    var jsApiParameters = "";
    $("footer").on("click", "#payNow", function callpay(event) {
        
        $.ajax({
              url: "/api/PrepayOrder/{{ $order["order_sn"] }}",
              type: "post",
              dataType: "json",
              cache: false,
          })
          .done(function(respones) {
              if(respones.error==0){
                  jsApiParameters = JSON.parse(respones.jsApiParameters);
                  callPay();
              }else{
                  alert(respones.msg);
              }
          })
          .fail(function() {
              alert("網絡錯誤,請稍后再試!");

          })
    });



    function callPay() {
        if (typeof WeixinJSBridge == "undefined"){
            if( document.addEventListener ){
                document.addEventListener("WeixinJSBridgeReady", jsApiCall, false);
            }else if (document.attachEvent){
                document.attachEvent("WeixinJSBridgeReady", jsApiCall);
                document.attachEvent("onWeixinJSBridgeReady", jsApiCall);
            }
        }else{
            jsApiCall();
        }
    }

    function jsApiCall()
    { 
      WeixinJSBridge.invoke(
        "getBrandWCPayRequest",jsApiParameters,
        function(res){
          //WeixinJSBridge.log(res.err_msg);
          if (res.err_msg == "get_brand_wcpay_request:ok") {
            alert("支付成功")
               //可以進行查看訂單,等操作
          } else {
                alert("支付失敗!");
          }
          //alert(res.err_code+res.err_desc+res.err_msg);
        }
      );
    }

</script>

#支付后的回調-》 預支付notify_url

use EasyWeChat\Kernel\Exceptions\Exception;
use EasyWeChat\Factory;
use EasyWeChat\Payment\Kernel\BaseClient;
...
//支付結果
    public function notify()
    {
        // 判斷是否支付成功
        $config = config("wechat.pay_config");
        $app = Factory::payment($config);
        try {
            BaseClient::setDefaultOptions([
                "curl" => [
                    CURLOPT_IPRESOLVE => CURL_IPRESOLVE_V4,
                ],
                "verify"=>false               //不開啟CURLOPT_SSL_VERIFYPEER, 這里后來線上ssl報錯加的,原因忘了
            ]);
            $response = $app->handlePaidNotify(function ($message, $fail) {
                $orderSn = $message["out_trade_no"];
                //開啟事務并上鎖
                DB::beginTransaction();
              檢查價格 {
                    //訂單不是待付款 或者金額不對直接結束//todo價格*100
                    DB::rollBack();
                    return true;
                }
                // 用戶是否支付成功
                if ($message["return_code"] === "SUCCESS" && array_get($message, "result_code") === "SUCCESS") {
                    // return_code 表示通信狀態,不代表支付狀態
                    // 成功后修改訂單已支付
                    data_set($orderInfo,"status",1);     //支付成功
                    data_set($orderInfo,"out_order_sn",array_get($message, "transaction_id"));     //支付單號
                    data_set($orderInfo,"pay_status",1);     //支付成功
                    data_set($orderInfo,"pay_time",date("Y-m-d H:i:s"));     //支付時間
                    data_set($orderInfo,"attributes",json_encode([]));//清空預支付訂單id
                    if($orderInfo->save()){
                        DB::commit();
                    }else{
                        //紀錄錯誤日志。。
                       
                        $error   = new ErrorLogModel($data);
                        $error->save();
                        DB::rollBack();
                    }
                }else{
                    //支付失敗直接結束
                    DB::rollBack();
                    return true;
                }
                
                }
                // 添加賬單 --無賬單處理
                //微信和短信通知支付成功
                $goods = new GoodsModel;
                //獲取商品詳情
                $goodsDetails = $goods->getGoodsById($message["attach"]);
                //微信通知
                ExamNotify::notifyWechat($goodsDetails,$orderInfo->user_id, $message["openid"]);
                // 短信通知to或郵件通知
                $phone = UserModel::query()->where("id", $orderInfo->user_id)->value("phone");
                if ($phone) {
                    ExamNotify::notifySms($goodsDetails,$orderInfo->user_id);
                }else{
                    ExamNotify::notifyEmail($goodsDetails,$orderInfo->user_id);
                }
            });

            return $response;

        } catch (Exception $e) {
            // 紀錄日志
            $data = [
                "note" => "微信通知異常",
                "params" => json_encode($e),
                "user_id" => 0,
                "code" => "wechat_notify",
                "ip" => ip2long(request()->ip()),
            ];
            $error   = new ErrorLogModel($data);
            $error->save();
        }

寫的比較粗略,只是一個支付的大致流程

easywechat 文檔鏈接https://www.easywechat.com/

免責聲明:本文僅代表文章作者的個人觀點,與本站無關。其原創性、真實性以及文中陳述文字和內容未經本站證實,請讀者僅作參考,并自行核實相關內容。如發現有害或侵權內容,請聯系郵箱:jubao@pinlue.com,我們將在第一時間進行核實處理。

http://image95.pinlue.com/image/13.jpg
分享
評論
首頁
暖暖高清在线观看视频桃花社区视频在线观看播放