微信支付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

------------------------------------------
声明: 原创文章,未经允许,禁止转载!
------------------------------------------

posted @ 2016-07-25 23:22  景岳  阅读(8857)  评论(0编辑  收藏