使用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元
不拘你的格式,只要能运行就好,时间紧,要交差,我实在不会,请大家帮忙