zoukankan      html  css  js  c++  java
  • 微信支付JsAPI

    https://pay.weixin.qq.com/wiki/doc/api/download/WxpayAPI_php_v3.zip
    下载获取微信支付demo压缩包
    
    打开压缩包,并将其中 WxpayAPI_php_v3example下的
    jsapi.php
    log.php
    WxPay.JsApiPay.php
    WxPay.MicroPay.php
    WxPay.NativePay.php
    解压缩到根目录 tellingtent/
    
    打开
    WxPay.JsApiPay.php
    WxPay.MicroPay.php
    WxPay.NativePay.php
    将其中涉及调用
    ../lib/......
    路径的改成
    lib/......
    
    然后即可将微信支付demo压缩包中WxpayAPI_php_v3下的lib文件夹也解压缩到根目录 tellingtent/
    
    修改 tellingtent/lib/WxPay.Config.php 以下内容
    const APPID = 'wx6385582ec2cc9108';//wx426b3015555a46be
    const MCHID = '1226119502';//1900009851
    const KEY = '8eujY70kmgkseu274980kH9e0uri78kd';//8934e7d15453e97507ef794cf7b0519d
    const APPSECRET = '7813490da6f1265e4901ffb80afaa36f';//7813490da6f1265e4901ffb80afaa36f
    这些内容从公众号中获取
    
    然后登陆公众号,设置支付授权目录,这里是
    http://anting.imagchina.com/tellingtent/
    tellingtent/即是存放支付文件的根目录
    
    并且在设置支付授权目录中下载一个MP_verify_2YfIdHkI4jOcQ30B.txt文件,存放到根目录 tellingtent/ 中
    
    打开jsapi.php
    将其中获取openid的
    $tools->GetOpenid();
    换成已获取的openid,这里是
    osKoBjx_vTKa67vgoJjH4Dg81tRk
    在这里暂时不借用官方的获取openid方法
    
    在微信中打开
    http://anting.imagchina.com/tellingtent/jsapi.php
    即可进行支付
    
    jsapi.php里的支付回调单号SetOut_trade_no自定义赋值,但不能重复,在支付成功后,微信会回调jsapi.php里SetNotify_url设定的路径,回调信息中有对应付款成功的out_trade_no单号
    
    最好在调用微信支付的js方法callpay()之前,先创建本地的订单信息,保存out_trade_no单号,并且设定支付状态为未支付
    在设定好的回调页面中根据支付成功的out_trade_no单号修改数据库中对应订单的付款状态为支付成功
    
    
    
    支付成功后回调页面内容
    PHP非以传统$_GET$_POST方式获取微信回调内容,以 file_get_contents('php://input'); 获取
    例
    <?php
    //$postStr获取到的是格式化字符串内容
    $postStr = file_get_contents('php://input');
    ?><xml>
    <appid><![CDATA[wx6385582ec2cc9108]]></appid> <attach><![CDATA[嘉亭荟移动故事屋]]></attach>
    <bank_type><![CDATA[CMB_DEBIT]]></bank_type> <cash_fee><![CDATA[8000]]></cash_fee>
    <fee_type><![CDATA[CNY]]></fee_type> <is_subscribe><![CDATA[Y]]></is_subscribe>
    <mch_id><![CDATA[1226119502]]></mch_id> <nonce_str><![CDATA[d0hh1c3m1ynd52qhajgsk6jwqcvkez0p]]></nonce_str>
    <openid><![CDATA[osKoBj2iVkFtf8-MBcHXyWkaXT4k]]></openid> <out_trade_no><![CDATA[122611950220160923172852]]></out_trade_no>
    <result_code><![CDATA[SUCCESS]]></result_code> <return_code><![CDATA[SUCCESS]]></return_code>
    <sign><![CDATA[D4F31510A3EED6F54AB0B4A02D772C98]]></sign> <time_end><![CDATA[20160923173254]]></time_end>
    <total_fee>8000</total_fee> <trade_type><![CDATA[JSAPI]]></trade_type> <transaction_id><![CDATA[4006602001201609234721061954]]></transaction_id>
    </xml>
    
    
    需要手动截取获取其中想要信息值
    如想要out_trade_no与transaction_id的值
    例
    <?php
    $postStr = file_get_contents('php://input');
    
    $trade_noarr = explode ( "out_trade_no><![CDATA[", $postStr );
    $trade_noarr = explode ( "]]></out_trade_no", $trade_noarr [1] );
    $out_trade_no = $trade_noarr [0];
    
    $arr = explode ( "transaction_id><![CDATA[", $postStr );
    $arr = explode ( "]]></transaction_id", $arr [1] );
    $transaction_id = $arr [0];
    
    // 即可根据返回的订单号修改数据库中对应订单信息
    ?>
    
    微信成功后同一单号会多次回调信息内容,一般三次
    
    
    
    
    
    
    
    设定的支付路径是根目录 tellingtent/ 不变
    
    可以把之前的
    jsapi.php
    log.php
    WxPay.JsApiPay.php
    WxPay.MicroPay.php
    WxPay.NativePay.php
    lib文件夹
    单独放到某个目录下面
    例如这里放到根目录下的
    tellingtent/testpay
    文件夹里
    把支付样例jsapi.php文件中的html部分代码提取出来单独存放在根目录下的某个文件内,这里是
    tellingtent/testpay.php
    代码内容
    <html>
    <head>
    <meta http-equiv="content-type" content="text/html;charset=utf-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1" />
    <script type="text/javascript" src="./testpay/jquery.min.js"></script>
    <title>微信支付样例-支付</title>
    <script type="text/javascript">
        var jsApiParameters = '';
        $.post("./testpay/jsapi.php",{},function(data){
            jsApiParameters = data;
            alert(jsApiParameters);
        },"json")
        
        //调用微信JS api 支付
            function jsApiCall()
            {
                if(jsApiParameters){
                    WeixinJSBridge.invoke(
                        'getBrandWCPayRequest',
                        jsApiParameters,
                        function(res){
                            WeixinJSBridge.log(res.err_msg);
                            alert(res.err_code+res.err_desc+res.err_msg);
                        }
                    );
                }
            }
    
            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 />
        <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>
    
    原页面直接通过php获取的jsApiParameters,改为通过ajax获取
    这样tellingtent/testpay文件夹内的原文件jsapi.php里只剩下之前的php代码
    <?php 
    ini_set('date.timezone','Asia/Shanghai');
    //error_reporting(E_ALL);
    require_once "lib/WxPay.Api.php";
    require_once "WxPay.JsApiPay.php";
    require_once 'log.php';
    //初始化日志
    $logHandler= new CLogFileHandler("../logs/".date('Y-m-d').'.log');
    $log = Log::Init($logHandler, 15);
    
    //打印输出数组信息
    function printf_info($data)
    {
        foreach($data as $key=>$value){
            //echo "<font color='#00ff55;'>$key</font> : $value <br/>";
        }
    }
    
    //①、获取用户openid
    $tools = new JsApiPay();
    $openId = 'osKoBjx_vTKa67vgoJjH4Dg81tRk';//$tools->GetOpenid();
    
    //②、统一下单
    $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://paysdk.weixin.qq.com/example/notify.php");
    $input->SetTrade_type("JSAPI");
    $input->SetOpenid($openId);
    $order = WxPayApi::unifiedOrder($input);
    //echo '<font color="#f00"><b>统一下单支付单信息</b></font><br/>';
    printf_info($order);
    $jsApiParameters = $tools->GetJsApiParameters($order);
    
    echo $jsApiParameters;exit;
    
    //获取共享收货地址js函数参数
    //$editAddress = $tools->GetEditAddressParameters();
    
    //③、在支持成功回调通知中处理成功之后的事宜,见 notify.php
    /**
     * 注意:
     * 1、当你的回调地址不可访问的时候,回调通知会失败,可以通过查询订单来确认支付是否成功
     * 2、jsapi支付时需要填入用户openid,WxPay.JsApiPay.php中有获取openid流程 (文档可以参考微信公众平台“网页授权接口”,
     * 参考http://mp.weixin.qq.com/wiki/17/c0f37d5704f0b64713d5d2c37b468d75.html)
     */
    ?>
    
    如此微信中访问
    http://anting.imagchina.com/tellingtent/testpay.php
    也可以进行支付
    只要支付调用js的文件在支付授权指定目录中即可
  • 相关阅读:
    动态规划
    Python第二天学习
    Python第一天学习---基础语法
    java易错知识点
    C语言---指针复习
    排序汇总
    课程设计---创建族谱管理系统
    Vue第五篇 Vue的生命周期
    Vue第四篇 Vue路由系统
    Vue第三篇 Vue组件
  • 原文地址:https://www.cnblogs.com/dreamhome/p/6230782.html
Copyright © 2011-2022 走看看