微信支付WxpayAPI_php_v3(二)支付功能開發


這里我沒有開發openid和acessToken的獲取,需要的請參考文檔獲取。

在閱讀本教程之前請熟讀微信支付的開發者文檔。

直接開始【統一下單】,在實際開發的項目中一般都有mvc分層的開發思想。

根據WxpayAPI_php_v3\example\jsapi.php給的代碼做修改。

Service:

<?php
/**
 * Created by PhpStorm.
 * User: skh
 * Date: 13/03/2017
 * Time: 10:43
 */

namespace App\Http\Services;


class WxPayService
{
    /**
     * @param $openId
     * @return String js支付參數
     */
    public function wxpay($openId)
    {
        //統一下單
        $input = new \WxPayUnifiedOrder();
        $input->SetBody("test");
        $input->SetAttach("test");
        $input->SetOut_trade_no(\WxPayConfig::MCHID.date("YmdHis"));
        $input->SetTotal_fee("1");
        $input->SetTime_start(date("YmdHis"));
        $input->SetTime_expire(date("YmdHis", time() + 600));
        $input->SetGoods_tag("test");
        $input->SetNotify_url("http://wxpay.foo.cn/weixin/test/notify");
        $input->SetTrade_type("JSAPI");
        $input->SetOpenid($openId);
        $order = \WxPayApi::unifiedOrder($input);


        $jsApiParameters = $this->getJsApiParameters($order);

        return $jsApiParameters;
    }

    /**
     *
     * 獲取jsapi支付的參數
     * @param  $UnifiedOrderResult array 統一支付接口返回的數據
     * @throws \WxPayException
     *
     * @return  array ,可直接填入js函數作為參數
     */
     private function getJsApiParameters($UnifiedOrderResult)
    {
        if(!array_key_exists("appid", $UnifiedOrderResult)
            || !array_key_exists("prepay_id", $UnifiedOrderResult)
            || $UnifiedOrderResult['prepay_id'] == "")
        {
            throw new \WxPayException("參數錯誤");
        }
        $jsapi = new \WxPayJsApiPay();
        $jsapi->SetAppid($UnifiedOrderResult["appid"]);
        $timeStamp = time();
        $jsapi->SetTimeStamp("$timeStamp");
        $jsapi->SetNonceStr(\WxPayApi::getNonceStr());
        $jsapi->SetPackage("prepay_id=" . $UnifiedOrderResult['prepay_id']);
        $jsapi->SetSignType("MD5");
        $jsapi->SetPaySign($jsapi->MakeSign());
        $parameters = $jsapi->GetValues();
        return $parameters;
    }
}

 

 Controller:

<?php

namespace App\Http\Controllers\Wechat;

use App\Http\Services\WxNotifyService;
use App\Http\Services\WxPayService;
use Illuminate\Http\Request;

use App\Http\Requests;
use App\Http\Controllers\Controller;
use Illuminate\Support\Facades\Log;

class WxPayController extends Controller
{
    /**
     * 支付接口
     */
    public function doPay(Request $request)
    {
        $openId = "oOUejv2ZyEDt3bIe6lQ4C32Z-9sk";

        $wxPayService = new WxPayService();

        $jsApiParameters = $wxPayService->wxpay($openId);
        // 返回支付詳情的頁面,並把從【統一下單】接口中得到json串串給頁面
        // 這個頁面描述了買的啥,多少錢,支付按鈕之類的
        // 在這個頁面點擊支付的時候可能出現找不到appId的錯誤.建議你按照文檔上的寫法發起支付.
        // 例子我在支付頁面里的js給出了demo
        return view("pay_details",compact('jsApiParameters'));
    }

    /**
     * 微信支付回調接口
     */
    public function notify()
    {
        Log::info("微信支付通知被調用了!!");
        $notify = new WxNotifyService();

        $notify->Handle(false);
    }
}

 

View:

<!DOCTYPE html>
<html>
<head>
    <meta http-equiv="content-type" content="text/html;charset=utf-8"/>
    <meta name="viewport" content="width=device-width, initial-scale=1"/>
    <title>微信支付樣例-支付</title>
    <script type="text/javascript">
        //調用微信JS api 支付
        function jsApiCall()
        {
             // 建議使用這中方式發起支付.
             WeixinJSBridge.invoke('getBrandWCPayRequest', {
                 //公眾號名稱,由商戶傳入
                 "appId":"{{$jsApiParameters['appId']}}",
                 "timeStamp":"{{$jsApiParameters['timeStamp']}}",  //時間戳,自1970年以來的秒數
                 "nonceStr":"{{$jsApiParameters['nonceStr']}}",    //隨機串
                 "package":"{{$jsApiParameters['package']}}",
                 "signType":"{{$jsApiParameters['signType']}}",     //微信簽名方式:
                 "paySign":"{{$jsApiParameters['paySign']}}"        //微信簽名
              }, function(res){
             // 使用以上方式判斷前端返回,微信團隊鄭重提示:res.err_msg將在用戶支付成功后返回    ok,但並不保證它絕對可靠。
               if(res.err_msg == "get_brand_wcpay_request:ok" ) {}
              }
             );
        }

        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();
            }
        }
    </script>
</head>
<body>
<br/>
<font color="#9ACD32"><b>該筆訂單支付金額為<span style="color:#f00;font-size:50px">1分</span>錢</b></font><br/><br/>
<p>{{'package'}}</p>
<div align="center">
    <button style="width:210px; height:50px; border-radius: 15px;background-color:#FE6714; border:0px #FE6714 solid; cursor: pointer;  color:white;  font-size:16px;" type="button" onclick="callpay()" >立即支付</button>
</div>
</body>
</html>

 

 下一篇:http://www.cnblogs.com/xxoome/p/6572590.html

技術交流群:576269252

------------------------------------------
聲明: 原創文章,未經允許,禁止轉載!
------------------------------------------


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM