微信公众号支付

=============================================================== 公众号支付问题 =============================================================
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>

  

原文地址:https://www.cnblogs.com/hefei/p/5786612.html