苹果橘子梨plus 2021-07-08 10:58 采纳率: 100%
浏览 161
已采纳

php在公众号实现微信支付修改支付金额?

使用php在微信公众号实现类似于手机充值页面的微信支付,就是把支付金额从前台传到后台,我用的是ajax中的post方式,但是一直报错。我是在新浪云SAE中写的,


<?php 
header("Content-type:text/html;charset=utf-8");
/**
*
* example目录下为简单的支付样例,仅能用于搭建快速体验微信支付使用
* 样例的作用仅限于指导如何使用sdk,在安全上面仅做了简单处理, 复制使用样例代码时请慎重
* 请勿直接直接使用样例对外提供服务
* 
**/
require_once "../lib/WxPay.Api.php";
require_once "WxPay.JsApiPay.php";
require_once "WxPay.Config.php";

//打印输出数组信息
function printf_info($data)
{
    foreach($data as $key=>$value){
        echo "<font color='#00ff55;'>$key</font> :  ".htmlspecialchars($value, ENT_QUOTES)." <br/>";
    }
}
if(isset($_POST['money'])){
     $money = $_POST['money'];
    $sum = intval($money);

try{

    $tools = new JsApiPay();
    $openId = $tools->GetOpenid();

    //②、统一下单
    $input = new WxPayUnifiedOrder();
    $input->SetBody("test");
    $input->SetAttach("test");
    $input->SetOut_trade_no("sdkphp".date("YmdHis"));
    $input->SetTotal_fee($sum);
    $input->SetTime_start(date("YmdHis"));
    $input->SetTime_expire(date("YmdHis", time() + 600));
    $input->SetGoods_tag("test");
    $input->SetNotify_url("http://paysdk.weixin.qq.com/wxPay/example/notify.php");
    $input->SetTrade_type("JSAPI");
    $input->SetOpenid($openId);
    $config = new WxPayConfig();
    $order = WxPayApi::unifiedOrder($config, $input);
    echo '<font color="#f00"><b>统一下单支付单信息</b></font><br/>';
    printf_info($order);
    $jsApiParameters = $tools->GetJsApiParameters($order);

    //获取共享收货地址js函数参数
    $editAddress = $tools->GetEditAddressParameters();
} catch(Exception $e) {
    
}

}

//①、获取用户openid

//③、在支持成功回调通知中处理成功之后的事宜,见 notify.php
/**
 * 注意:
 * 1、当你的回调地址不可访问的时候,回调通知会失败,可以通过查询订单来确认支付是否成功
 * 2、jsapi支付时需要填入用户openid,WxPay.JsApiPay.php中有获取openid流程 (文档可以参考微信公众平台“网页授权接口”,
 * 参考http://mp.weixin.qq.com/wiki/17/c0f37d5704f0b64713d5d2c37b468d75.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',
            <?php echo $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();
        }
    }
         function sub(){
            var money = document.getElementById("money").getAttribute("value");
            $.ajax({
                url:'#',
                type:'post',
                data:{
                    money:money
                },
                success:function(){
                    return true;
                }
            })
        }
    </script>
    <script type="text/javascript">
    //获取共享地址
    function editAddress()
    {
        WeixinJSBridge.invoke(
            'editAddress',
            <?php echo $editAddress; ?>,
            function(res){
                var value1 = res.proviceFirstStageName;
                var value2 = res.addressCitySecondStageName;
                var value3 = res.addressCountiesThirdStageName;
                var value4 = res.addressDetailInfo;
                var tel = res.telNumber;
                
                //alert(value1 + value2 + value3 + value4 + ":" + tel);
            }
        );
    }
    
    window.onload = function(){
        if (typeof WeixinJSBridge == "undefined"){
            if( document.addEventListener ){
                document.addEventListener('WeixinJSBridgeReady', editAddress, false);
            }else if (document.attachEvent){
                document.attachEvent('WeixinJSBridgeReady', editAddress); 
                document.attachEvent('onWeixinJSBridgeReady', editAddress);
            }
        }else{
            editAddress();
        }
    };
    
    </script>
</head>
<body>
        <button id="money" onclick="sub()" id="money" value="30">提交金额</button>
        <button onclick="callpay()" id="pay"></button>
       
</body>
</html>

个人猜测可能是执行顺序的问题,但是按照想法修改还是不行,酬金不多,20元,请大家不吝赐教

  • 写回答

4条回答 默认 最新

  • CSDN专家-showbo 2021-07-08 11:47
    关注

    问题蛮多的,大概改了下,看里面的代码注释,有帮助能点个采纳【右上角】吗,谢谢,有其他问题可以继续交流~

    你用到了jquery框架的代码,但是没见你导入jquery框架呢?

    
    <?php 
    header("Content-type:text/html;charset=utf-8");
    /**
    *
    * example目录下为简单的支付样例,仅能用于搭建快速体验微信支付使用
    * 样例的作用仅限于指导如何使用sdk,在安全上面仅做了简单处理, 复制使用样例代码时请慎重
    * 请勿直接直接使用样例对外提供服务
    * 
    **/
    require_once "../lib/WxPay.Api.php";
    require_once "WxPay.JsApiPay.php";
    require_once "WxPay.Config.php";
    //打印输出数组信息
    function printf_info($data)
    {
        foreach($data as $key=>$value){
            echo "<font color='#00ff55;'>$key</font> :  ".htmlspecialchars($value, ENT_QUOTES)." <br/>";
        }
    }
    if(isset($_POST['money'])){
         $money = $_POST['money'];
        $sum = intval($money)*100;//如果你的30单位为元,这里要*100转为分
    try{
        $tools = new JsApiPay();
        $openId = $tools->GetOpenid();
        //②、统一下单
        $input = new WxPayUnifiedOrder();
        $input->SetBody("test");
        $input->SetAttach("test");
        $input->SetOut_trade_no("sdkphp".date("YmdHis"));
        $input->SetTotal_fee($sum);
        $input->SetTime_start(date("YmdHis"));
        $input->SetTime_expire(date("YmdHis", time() + 600));
        $input->SetGoods_tag("test");
        $input->SetNotify_url("http://paysdk.weixin.qq.com/wxPay/example/notify.php");
        $input->SetTrade_type("JSAPI");
        $input->SetOpenid($openId);
        $config = new WxPayConfig();
        $order = WxPayApi::unifiedOrder($config, $input);
        ///不要输出无关信息,只需要输出客户端需要的参数,要么就不需要ajax,直接form表单提交你的代码就正确了,会走这里的if判断
        ///echo '<font color="#f00"><b>统一下单支付单信息</b></font><br/>';
        //printf_info($order);
        $jsApiParameters = $tools->GetJsApiParameters($order);
        //获取共享收货地址js函数参数
        $editAddress = $tools->GetEditAddressParameters();
    
        /////这里组合数组返回json格式字符串
        $data=json_encode(array("editAddress"=>$editAddress,"jsApiParameters"=>$jsApiParameters));
        die($data);
    
    } catch(Exception $e) {
    }
    }
    //①、获取用户openid
    //③、在支持成功回调通知中处理成功之后的事宜,见 notify.php
    /**
     * 注意:
     * 1、当你的回调地址不可访问的时候,回调通知会失败,可以通过查询订单来确认支付是否成功
     * 2、jsapi支付时需要填入用户openid,WxPay.JsApiPay.php中有获取openid流程 (文档可以参考微信公众平台“网页授权接口”,
     * 参考http://mp.weixin.qq.com/wiki/17/c0f37d5704f0b64713d5d2c37b468d75.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 src="https://g.csdnimg.cn/??lib/jquery/1.12.4/jquery.min.js"></script>
        <script type="text/javascript">
        //调用微信JS api 支付
        function jsApiCall()
        {
            WeixinJSBridge.invoke(
                'getBrandWCPayRequest',
                jsApiParameters,//这里不能直接输出服务器端变量,因为你的ajax异步获取的,第一次访问服务器端并没有走if(isset($_POST['money']))设置变量值,所以这里空值会导致js语法错误,下面的编辑地址一样,要通过参数出入
                function(res){
                    WeixinJSBridge.log(res.err_msg);
                    alert(res.err_code+res.err_desc+res.err_msg);
                }
            );
        }
    
        
        var editAddressParameters,jsApiParameters;//全局变量用于接收ajax返回的editAddress变量值
        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 sub(){
                var money = document.getElementById("money").getAttribute("value");
                $.ajax({
                    url:'#',
                    type:'post',
                    dataType:'json',
                    data:{
                        money:money
                    },
                    success:function(d){
                    //这里是关键,要显示支付和编辑地址按钮及设置相关参数
                    $('#editAddress,#pay').show();//显示按钮
                    //设置变量值
                    editAddressParameters=d.editAddress
                    jsApiParameters=d.jsApiParameters
    
                    },
                    error:function(xhr){
                    alert('出错:'+xhr+'\n'+xhr.responseText)
                    }
                })
            }
        </script>
        <script type="text/javascript">
        //获取共享地址
        function editAddress()
        {
            WeixinJSBridge.invoke(
                'editAddress',
                editAddressParameters,
                function(res){
                    var value1 = res.proviceFirstStageName;
                    var value2 = res.addressCitySecondStageName;
                    var value3 = res.addressCountiesThirdStageName;
                    var value4 = res.addressDetailInfo;
                    var tel = res.telNumber;
                    //alert(value1 + value2 + value3 + value4 + ":" + tel);
                }
            );
        }
        //不能页面加载完毕就执行编辑地址,没有editAddress参数
        /*window.onload = */function editAddr(){
            if (typeof WeixinJSBridge == "undefined"){
                if( document.addEventListener ){
                    document.addEventListener('WeixinJSBridgeReady', editAddress, false);
                }else if (document.attachEvent){
                    document.attachEvent('WeixinJSBridgeReady', editAddress); 
                    document.attachEvent('onWeixinJSBridgeReady', editAddress);
                }
            }else{
                editAddress();
            }
        };
        </script>
    </head>
    <body>
            <button id="money" onclick="sub()" id="money" value="30">提交金额</button>
            <button onclick="callpay()" id="pay" style="display:none">点击支付,默认也要隐藏,没有支付参数</button>
            <button onclick="editAddr()" id="editAddress" style="display:none">编辑地址,由于编辑地址参数是提交金额时获取的,所以默认先隐藏,点击提交金额后才显示出来给点击</button>
    </body>
    </html>
    
    

    最简单的就用POST提交,就能获取到支付和编辑的变量了(但get访问第一次还是会出错,没走if判断设置参数)

    <input type="hidden" name="money" value="30">
    <button >提交金额</button>
    <button onclick="callpay()" id="pay">点击支付,默认也要隐藏,没有支付参数</button>
    <button  id="editAddress" >编辑地址</button>
    </form>
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(3条)

报告相同问题?

问题事件

  • 已采纳回答 7月9日

悬赏问题

  • ¥15 php环境如何实现国密SM2相关功能
  • ¥15 关于#单片机#的问题:K210 例程里面提示我iomem.h: No such file or directory
  • ¥15 LSPI算法的大问题
  • ¥15 java导出word 动态填充数据
  • ¥20 扑克的算牌公式及软件制作
  • ¥20 如何通过云图中RPG去计算云图上不同位置的值?
  • ¥15 请问不小心下载到了钓鱼软件怎么办?
  • ¥15 求国博抢票 求国博抢票 有的私
  • ¥50 swiftui @query 报错
  • ¥50 怎么解决刷卡或扫码后,点击软件输入框,win10屏幕键盘不会自动弹出的问题