分类 应用 下的文章
微擎旧版本支付提示下单用户不一致,授权快照问题
由于微信公众号昵称头像授权政策调整,导致微擎打开应用页面跳转授权快照,获取不到用户真实的openid,造成无法支付,提示支付提示下单用户不一致。只需要把微擎默认的自动授权方式,改为引导用户手动点击授权就可以了。下面是修改的方式,需要修改到微擎源码。
1、新建一个手动授权的模板html文件,命名为auth.html
,文件里的代码如下:
<!DOCTYPE html>
<html lang="zh-cn">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0" />
<title>授权登录-{$_W['account']['name']}</title>
<meta name="keywords" content="{$_W['account']['name']}">
<meta name="description" content="{$_W['account']['name']}">
<style>
.container {
padding: 50px 15px;
text-align: center;
}
.logo {
width: 140px;
margin: 0 auto 42px;
text-align: center;
}
.logo img {
max-width: 100%;
vertical-align: middle;
}
.container h2 {
margin: 0;
padding: 0;
line-height: 44px;
font-size: 24px;
font-weight: 500;
}
.container p {
margin: 0;
padding: 0;
line-height: 34px;
font-size: 16px;
}
.auth-btn {
width: 98%;
display: block;
line-height: 50px;
background: #0bb20c;
color: #FFFFFF;
text-align: center;
font-size: 20px;
border-radius: 24px;
text-decoration: none;
margin-top: 44px;
}
.is-snapshoot {
display: none;
width: 100%;
height: 100%;
position: absolute;
top: 0;
left: 0;
background-position: center;
background-size: 100% 100%;
z-index: 1;
text-align: center;
}
</style>
</head>
<body>
<div class="container">
<!-- <div class="logo">-->
<!-- <img src="{$_W['account']['logo']}" alt="{$_W['account']['name']}">-->
<!-- </div>-->
<h2>授权登录</h2>
<p>为了提供更完善的服务,请先授权登录!</p>
<div class="login-btn">
<a class="auth-btn" href="{$forward}">点击授权登录</a>
</div>
</div>
<div class="is-snapshoot" {if isset($_GPC['is_snapshotuser']) && $_GPC['is_snapshotuser']=='1' }style="display:block;" {/if}>请点击右下角【使用完整服务】</div>
</body>
</html>
创建文件后,把它放在目录/app/themes/default/auth/auth.html
下
2、修改 /app/common/bootstrap.app.inc.php
文件,在这块代码大概171行下
if ($oauth_type == 'snsapi_base') {
$forward = $oauth_account->getOauthCodeUrl($callback, $state);
} else {
$forward = $oauth_account->getOauthUserInfoUrl($callback, $state);
}
新增如下代码:
template('auth/auth');
exit();
3、修改用户授权SESSION有效期。
把 /app/common/bootstrap.app.inc.php
文件里的
这段代码WeSession::start($_W['uniacid'], CLIENT_IP);
替换成:WeSession::start($_W['uniacid'], CLIENT_IP, (15 * 86400)); //15天有效期
4、在用户不授权的情况,再次进入系统,也会变成虚拟用户;修改文件:/app/source/auth/oauth.ctrl.php
在文件这段代码:
$oauth = $oauth_account->getOauthInfo($code);
下面大概30行新增如下代码:
if( isset($oauth['is_snapshotuser']) && intval($oauth['is_snapshotuser']) === 1){
$_SESSION['oauth_openid'] = '';
$backUrl = urldecode($_SESSION['dest_url']).'&is_snapshotuser=1'; //设置当前为快照模式,可以在授权页加个箭头引导右下角微信官方授权页面
header('Location: ' . $backUrl);
exit();
}
修改结束,最终效果是当用户访问应用的时候,就会先跳转到手动授权登录页面,点击授权按钮后,跳转到应用页面。
微信支付异步回调测试,模拟post数据
<xml><appid><![CDATA[wxdedd85d835c1fd1b]]></appid>
<bank_type><![CDATA[ICBC_DEBIT]]></bank_type>
<cash_fee><![CDATA[50]]></cash_fee>
<fee_type><![CDATA[CNY]]></fee_type>
<is_subscribe><![CDATA[N]]></is_subscribe>
<mch_id><![CDATA[1635643555]]></mch_id>
<nonce_str><![CDATA[642fd024150da]]></nonce_str>
<openid><![CDATA[oOZY75UZW8Qv-Jc1zXGm92Pg8HCo]]></openid>
<out_trade_no><![CDATA[201351898]]></out_trade_no>
<result_code><![CDATA[SUCCESS]]></result_code>
<return_code><![CDATA[SUCCESS]]></return_code>
<sign><![CDATA[9324D932D2B2FADC3240926E30D21D24]]></sign>
<time_end><![CDATA[20230407161121]]></time_end>
<total_fee>50</total_fee>
<trade_type><![CDATA[JSAPI]]></trade_type>
<transaction_id><![CDATA[4200001727202304074310355037]]></transaction_id>
</xml>
{"id":"cf4a45c7-a421-593e-bd58-ad84ab2ab984","create_time":"2024-05-07T11:50:09+08:00","resource_type":"encrypt-resource","event_type":"TRANSACTION.SUCCESS","summary":"支付成功","resource":{"original_type":"transaction","algorithm":"AEAD_AES_256_GCM","ciphertext":"4Y4Wvzrwah0sRbX51if8fsCttc8xbTFyy0NyFaCLqqdsZ7lCRM4vQGcp8L7/1ixGvzot1K3iS7Pd2Ecr3LadO1EMu52+ygVncVsb9CR3QkoqTsNNtPJ5+7pOc3+nIG7EOFgkenRPmSCQVhlpDbpGqFDdB++isx5JTIUQCqlKAqnytihnZR1nR8yiBXsYP7geyEOGowIYcvHhynxiFdkEX62Y+PPSY2bYg25yzJO8+mq5VrDoKdHor+GcDcQqYgVous49om6YpZsc+oVaOEqofNVOlR0iDBHvr9P+FOq+K5D76sOwCx2ndwngB4h2cZ+PHIbYt6TPv+RhdCOMnNIO3PqHoBjp37aM+KGJKaOh7jLJWyDg705L+GZuZe6yhOdqq/cUvJ39aET6OfSzLLUc9YQLOmkQBxFSnAQx8d8dsm+1BEo6TME2srfc21zKHsTdtI7UxpOtd/9HHz9I+K64EU322+vi4vNw27L5XCmDtOGSaq1qhYHgcOh9Vr8Z1FJ/yUijfFNaU+OjdEqXLtwac6wLxT5jckpqlcmLz8cz7PcCejrr9++POhkxjZ+g2EWeYSDXyQ==","associated_data":"transaction","nonce":"NdcSRlifWBDN"}}
nginx允许跨域
# 指定允许跨域的方法,*代表所有
add_header Access-Control-Allow-Methods *;
# 预检命令的缓存,如果不缓存每次会发送两次请求
add_header Access-Control-Max-Age 3600;
# 不带cookie请求,并设置为false
add_header Access-Control-Allow-Credentials false;
# 表示允许这个域跨域调用(客户端发送请求的域名和端口)
# $http_origin动态获取请求客户端请求的域 不用*的原因是带cookie的请求不支持*号
add_header Access-Control-Allow-Origin $http_origin;
# 表示请求头的字段 动态获取
add_header Access-Control-Allow-Headers
$http_access_control_request_headers;
# OPTIONS预检命令,预检命令通过时才发送请求
# 检查请求的类型是不是预检命令
if ($request_method = OPTIONS){
return 200;
}
phpstudy nginx设置cors跨域不起作用的可能解决方法
location / {
#...
add_header Access-Control-Allow-Origin *;
add_header Access-Control-Allow-Methods *;
add_header Access-Control-Allow-Headers *;
}
html2canvas阿里云跨域设置
access-control-allow-origin:*
access-control-allow-credentials:true
600