=============================================================== 公众号支付问题 =============================================================
1. 参数有问题,id前面没有问号 /example/jsapi.phpid=2?code=001A2wej24e0cL00vvej2nfuej2A2wen&state=STATE 解决方法: 修改 /example/WxPay.JsApiPay.php 文件 GetOpenid方法 $baseUrl 改为:$baseUrl = urlencode('http://'.$_SERVER['HTTP_HOST'].$_SERVER['PHP_SELF'].'?'.$_SERVER['QUERY_STRING']);
2. attach 有中文,会导致签名验证不正确
解决方法:
md5 前需 urldecode 编码
urldecode(http_build_query($data)
//####################################### notify.php 充值回调 验证签名及数据获取 #####################################// //验证签名 foreach($data as $k=>$v){ if($v == ''){ unset($data[$k]); //空参数不参与签名 } } $sign = isset($data['sign']) ? $data['sign'] : ''; if($sign != ''){ unset($data['sign']); //sign不参与签名 } ksort($data); $key = '&key='.WxPayConfig::KEY; $secret_str = strtoupper(md5(urldecode(http_build_query($data).$key))); if($secret_str != $sign){ $msg = '签名不正确'; return false; } //获取微信返回数据 $id = $data['out_trade_no']; //平台支付订单号 $transaction_id = $data['transaction_id']; //微信订单号 $total_fee = $data['total_fee']/100; //充值金额 $result_code = $data['result_code']; //业务结果 $now = time();
*************************************************** 以下是 扫码支付案例 native.php 代码 ************************************************************
//###################################### 开启session ##############################################// session_start(); //####################################################################################// ini_set('date.timezone','Asia/Shanghai'); //error_reporting(E_ERROR); require_once "../lib/WxPay.Api.php"; require_once "WxPay.NativePay.php"; require_once 'log.php'; //####################################### 判断用户是否已登录 #############################################// //获取数据 $userid = isset($_SESSION['userid']) ? $_SESSION['userid'] : 0; $id = isset($_GET['id']) ? intval($_GET['id']) : $_GET['id']; //订单ID //判断用户是否已登录 if($userid == 0){ echo '未登录';exit; } //####################################### 验证订单 #############################################// $pdo = new PDO('mysql:host=192.168.1.211;dbname=yyweipan;charset=utf8', 'root', '123456'); //判断订单是否属于当前账号 $rs = $pdo->query('select * from yywl_recharge where Id='.$id); $recharge = $rs->fetch(); if(empty($recharge) || $recharge['UserId'] != $userid){ echo '订单不存在';exit; } $money = $money*100; //####################################################################################// //模式一 /** * 流程: * 1、组装包含支付信息的url,生成二维码 * 2、用户扫描二维码,进行支付 * 3、确定支付之后,微信服务器会回调预先配置的回调地址,在【微信开放平台-微信支付-支付配置】中进行配置 * 4、在接到回调通知之后,用户进行统一下单支付,并返回支付信息以完成支付(见:native_notify.php) * 5、支付完成之后,微信服务器会通知支付成功 * 6、在支付成功通知中需要查单确认是否真正支付成功(见:notify.php) */ $notify = new NativePay(); $url1 = $notify->GetPrePayUrl($id); //模式二 /** * 流程: * 1、调用统一下单,取得code_url,生成二维码 * 2、用户扫描二维码,进行支付 * 3、支付完成之后,微信服务器会通知支付成功 * 4、在支付成功通知中需要查单确认是否真正支付成功(见:notify.php) */ $input = new WxPayUnifiedOrder(); $input->SetBody("test"); $input->SetAttach("test"); $input->SetOut_trade_no($id); //商家订单号 $input->SetTotal_fee($money); //金额 $input->SetTime_start(date("YmdHis")); $input->SetTime_expire(date("YmdHis", time() + 600)); $input->SetGoods_tag("test"); $input->SetNotify_url("http://ce.gzhouyo.com/weixin/example/notify.php"); //异步回调地址 $input->SetTrade_type("NATIVE"); $input->SetProduct_id($id); //产品ID $result = $notify->GetPayUrl($input); $url2 = $result["code_url"];
<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> </head> <body> <div style="margin-left: 10px;color:#556B2F;font-size:30px;font-weight: bolder;">扫描支付模式一</div><br/> <img alt="模式一扫码支付" src="http://paysdk.weixin.qq.com/example/qrcode.php?data=<?php echo urlencode($url1);?>" style="150px;height:150px;"/> <br/><br/><br/> <div style="margin-left: 10px;color:#556B2F;font-size:30px;font-weight: bolder;">扫描支付模式二</div><br/> <img alt="模式二扫码支付" src="http://paysdk.weixin.qq.com/example/qrcode.php?data=<?php echo urlencode($url2);?>" style="150px;height:150px;"/> </body> </html>