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元,请大家不吝赐教

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

你用到了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>

在微信中如果你要支付的金额是100元,那么你传入的数值是10000,意思是微信的单位是按分计算的。支付金额,最低为一分钱,即0.01元, 必须是整数,这里设置100块,你也可以设置1,显示为0.01元。你可以参考一下:https://blog.csdn.net/weixin_42433970/article/details/97661803

话不多说,现在需要开发一个微信公众号内微信支付的页面,类似于手机充值的那种,有意者,请回复我,酬金不多,但愿全部献上,100元

不拘你的格式,只要能运行就好,时间紧,要交差,我实在不会,请大家帮忙