zoukankan      html  css  js  c++  java
  • 微信支付WxpayAPI_php_v3(二)支付功能开发

    这里我没有开发openid和acessToken的获取,需要的请参考文档获取。

    在阅读本教程之前请熟读微信支付的开发者文档。

    直接开始【统一下单】,在实际开发的项目中一般都有mvc分层的开发思想。

    根据WxpayAPI_php_v3examplejsapi.php给的代码做修改。

    Service:

    <?php
    /**
     * Created by PhpStorm.
     * User: skh
     * Date: 13/03/2017
     * Time: 10:43
     */
    
    namespace AppHttpServices;
    
    
    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 AppHttpControllersWechat;
    
    use AppHttpServicesWxNotifyService;
    use AppHttpServicesWxPayService;
    use IlluminateHttpRequest;
    
    use AppHttpRequests;
    use AppHttpControllersController;
    use IlluminateSupportFacadesLog;
    
    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="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

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

  • 相关阅读:
    python模块导入
    linux总结shell
    linux和shell关系
    gdb调试工具
    C语言.c和.h
    CSS cursor 属性
    html dom SetInterVal()
    css hover伪类选择器与JQuery hover()方法
    CSS 清除浮动 clear 属性
    block,inline和inline-block概念和区别
  • 原文地址:https://www.cnblogs.com/xxoome/p/5705761.html
Copyright © 2011-2022 走看看