- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章PHP实现一个二维码同时支持支付宝和微信支付的示例由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
实现思路 。
效果展示 。
提示: 因为项目即将上线,所以上面的支付二维码连接被我替换了(注意在生成二维码时加入的连接,要带上http协议) 。
实现 。
步骤生成二维码 。
1
2
3
|
//我的url指向了checkTerrace方法
$url
= self::ADMIN_URL .
'params='
.
$params
;
//ADMIN_URL是生成二维码的url,请替换成自己
|
处理用户扫码操作(checkTerrace方法) 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
|
public
function
checkTerrace()
{
$pay_type
=
$this
->getPayType();
//该方法使用来判断用户扫码终端的
$params
=
$this
->request->get(
'params'
);
//生成二维码url带的参数(看个人需求,我的项目需要额外参数)
$params
=
$this
->desDecode(
$params
);
//这里是因为我对参数进行了desc加密,看个人需求
if
(
$pay_type
===
'alipay'
) {
//如果用户是通过支付宝扫码,进行支付宝相关操作
if
(
$params
=== false) {
echo
"系统错误!,请稍后重试"
;
exit
;
}
$res
=
$this
->createOrder(
$pay_type
,
$params
);
if
(!
$res
) {
echo
"系统错误,请稍后重试"
;
exit
;
}
$this
->aliPay(
$res
);
}
elseif
(
$pay_type
===
'wechat'
) {
//如果用户是通过微信扫码,进行微信相关操作
if
(
$params
=== false) {
echo
"系统错误,请稍后重试"
;
exit
;
}
$prepare
=
$this
->wechat(
$pay_type
,
$params
);
$this
->assign(
'json'
,
$prepare
);
return
$this
->display(
'wpay.html'
);
}
elseif
(
$pay_type
=== false) {
echo
"请使用支付宝或微信进行扫码"
;
exit
;
}
}
|
判断扫码终端 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
/**
* 判断扫码终端
*
* @return string|boolean
* @date 2021-02-04
*/
private
function
getPayType()
{
if
(
strstr
(
$_SERVER
[
'HTTP_USER_AGENT'
],
'AlipayClient'
)) {
return
"alipay"
;
}
elseif
(
strstr
(
$_SERVER
[
'HTTP_USER_AGENT'
],
'MicroMessenger'
)) {
return
"wechat"
;
}
else
{
return
false;
}
}
|
生成订单 。
1
2
3
4
5
6
7
8
9
10
11
12
13
|
/**
* 生成订单
*
* @param string $pay_type
* @param json $params
* @return void
* @date 2021-02-04
*/
//这个逻辑就不贴代码了
private
function
createOrder(
$pay_type
,
$params
)
{
/*生成订单相关逻辑代码*/
}
|
支付宝支付 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
/**
* 唤起支付宝app
*
* @param array $api_params
* @return void
* @date 2021-02-04
*/
private
function
aliPay(
$api_params
)
{
$config
= [
'notify_url'
=>
'异步回调地址'
,
'is_open_certificate'
=> true
];
$domain
= urlencode(
$api_params
[
'domain'
]);
$api
= [
'out_trade_no'
=>
$api_params
[
'trade_no'
],
'total_amount'
=>
'0.01'
,
'subject'
=>
'商品标题'
,
'passback_params'
=>
$domain
];
$pay
=
new
Pay(
$config
);
$res
=
$pay
->driver(
'alipay'
)->gateway(
'wap'
)->pay(
$api
);
//调用支付宝手机网站支付
echo
$res
;
}
|
微信支付 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
|
/**
* 唤起微信app
*
* @return void
* @date 2021-02-04
*/
public
function
wechat(
$pay_type
,
$params
)
{
$opend_id
=
$this
->getOpenId();
//处理微信jsapi支付之前,要先获取用户的openID
if
(!
$opend_id
) {
echo
"微信授权失败..."
;
exit
;
}
$api_params
=
$this
->createOrder(
$pay_type
,
$params
);
//用户openID获取成功后才进行订单生产操作
if
(!
$api_params
) {
echo
"系统错误,请稍后重试"
;
exit
;
}
$config
= [
'notify_url'
=>
'微信异步回调地址'
];
$api
= [
'body'
=>
'我是标题'
,
'out_trade_no'
=>
$api_params
[
'trade_no'
],
'total_fee'
=> 1,
'openid'
=>
$opend_id
,
'attach'
=>
$api_params
[
'domain'
]
];
$pay
=
new
Pay(
$config
);
$res
=
$pay
->driver(
'wechat'
)->gateway(
'mp'
)->pay(
$api
);
//调用微信jsapi支付
return
$res
;
}
|
静默获取openID 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
|
/**
* 获取用户的openid
*
* @return void
* @date 2021-02-04
*/
public
function
getOpenId()
{
if
(isset(
$_SESSION
[
'open_id'
]) &&
$_SESSION
[
'open_id'
]) {
return
$_SESSION
[
'open_id'
];
}
if
(!
$this
->request->get(
'code'
)) {
$redirect_uri
=
$_SERVER
[
'REQUEST_SCHEME'
] .
'://'
.
$_SERVER
[
'HTTP_HOST'
] .
$_SERVER
[
'REQUEST_URI'
]; //这里授权后微信跳转的地址,要写在订单处理处,否则会造成因为程序跳转到微信授权页面,导致脚本逻辑终止
$redirect_uri
= urlencode(
$redirect_uri
);
$url
=
$this
->codeUrl .
'redirect_uri='
.
$redirect_uri
.
'&appid='
.
$this
->appId .
'&scope=snsapi_base&response_type=code&state=STATE#wechat_redirect'
;
//使用用户静默授权模式(因为我不需要获取用户信息所有就没采用用户手段授权模式)
header(
"location:{$url}"
);
//跳转到微信授权页面
}
else
{
$openidurl
=
$this
->openidUrl .
'appid='
.
$this
->appId .
'&secret='
.
$this
->appSecret .
'&code='
.
$this
->request->get(
'code'
) .
'&grant_type=authorization_code'
;
$data
= Http::get(
$openidurl
);
$data
= json_decode(
$data
, true);
if
(
$data
[
'openid'
]) {
$_SESSION
[
'open_id'
] =
$data
[
'openid'
];
//获取到的用户openID存储到session中
}
else
{
$_SESSION
[
'open_id'
] = false;
}
return
$_SESSION
[
'open_id'
];
}
}
|
前端轮询判断监听订单支付状态 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
|
$(
function
() {
$(
"#code"
).qrcode({
//jQuery生成二维码
width: 165,
//宽度
height: 167,
//高度
text: $(
'input[name="url"]'
).val()
});
var
startTime =
Date
.parse(
new
Date
())/1000;
//设置定时器
var
poll_request = setInterval(
function
() {
$.ajax({
url:
'/company/StoreSetting/checkStatus'
,
data:{time:startTime},
dataType:
'json'
,
type:
'get'
,
success:
function
(res) {
if
(res.code == 400) {
var
result = clearTimer(poll_request, startTime);
if
(result) {
var
html = `<img src=
"/Static/images/paybg.png"
>`+
`<div
class
=
"notify"
id=
"notify"
>`+
`<img src=
"/Static/images/pay_time_out.png"
alt=
""
>`+
`<span
class
=
"pay_tip"
>点击重新获取</span>`+
`</div>`;
$(
'.qrcode-img'
).
empty
();
$(
'.qrcode-img'
).append(html);
}
}
else
if
(res.code == 500) {
var
html = `<img src=
"/Static/images/paybg.png"
>`+
`<div
class
=
"notify"
>`+
`<img src=
"/Static/images/pay_error.png"
alt=
""
>`+
`<span
class
=
"pay_tip"
>已扫码<br>请在手机端操作</span>`+
`</div>`;
$(
'.qrcode-img'
).
empty
();
$(
'.qrcode-img'
).append(html);
clearTimer(poll_request, startTime);
}
else
if
(res.code == 200) {
clearInterval(poll_request)
layer.msg(
"支付成功"
, {icon:6},
function
() {
window.location.reload()
})
// layer.msg("支付成功", {icon:6}, function() {
// })
}
}
})
}, 2000);
})
function
clearTimer(index, startTime) {
if
(((
Date
.parse(
new
Date
())/1000) - startTime) > 60) {
clearInterval(index)
return
'reload'
;
}
return
false;
}
//刷新二维码
$(
'.qrcode-img'
).on(
"click"
,
'#notify'
,
function
() {
$(
'.qrcode-img'
).
empty
()
$(
"#code"
).qrcode({
width: 165,
//宽度
height: 167,
//高度
text: $(
'input[name="url"]'
).val()
});
var
startTime =
Date
.parse(
new
Date
())/1000;
var
poll_request = setInterval(
function
() {
$.ajax({
url:
'/company/StoreSetting/checkStatus'
,
data:{time:startTime},
dataType:
'json'
,
type:
'get'
,
success:
function
(res) {
if
(res.code == 400) {
var
result = clearTimer(poll_request, startTime);
if
(result) {
var
html = `<img src=
"/Static/images/paybg.png"
>`+
`<div
class
=
"notify"
id=
"notify"
>`+
`<img src=
"/Static/images/pay_time_out.png"
alt=
""
>`+
`<span
class
=
"pay_tip"
>点击重新获取</span>`+
`</div>`;
$(
'.qrcode-img'
).
empty
();
$(
'.qrcode-img'
).append(html);
}
}
else
if
(res.code == 500) {
var
html = `<img src=
"/Static/images/paybg.png"
>`+
`<div
class
=
"notify"
>`+
`<img src=
"/Static/images/pay_error.png"
alt=
""
>`+
`<span
class
=
"pay_tip"
>已扫码<br>请在手机端操作</span>`+
`</div>`;
$(
'.qrcode-img'
).
empty
();
$(
'.qrcode-img'
).append(html);
clearTimer(poll_request, startTime);
}
else
if
(res.code == 200) {
clearInterval(poll_request)
layer.msg(
"支付成功"
, {icon:6},
function
() {
window.location.reload()
})
// layer.msg("支付成功", {icon:6}, function() {
// })
}
}
})
}, 2000);
})
|
前端效果:
用户进入支付页面但是一直为扫码,超过一定时间 。
用户扫码后一直未进行支付,超过一定时间 。
到此这篇关于PHP实现一个二维码同时支持支付宝和微信支付的示例的文章就介绍到这了,更多相关PHP 支付宝和微信支付内容请搜索我以前的文章或继续浏览下面的相关文章希望大家以后多多支持我! 。
原文链接:https://www.cnblogs.com/onepig/p/14411338.html 。
最后此篇关于PHP实现一个二维码同时支持支付宝和微信支付的示例的文章就讲到这里了,如果你想了解更多关于PHP实现一个二维码同时支持支付宝和微信支付的示例的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
可以在 R 中生成二维码吗?是否有允许它的包? 最佳答案 现在在 CRAN 您可以使用 qrencoder包 - https://github.com/hrbrmstr/qrencoder - 这样做
我有一个使用相机扫描二维码的应用程序。当我打开应用程序并转到二维码阅读器时,一切正常。一旦我扫描代码,信息就会发送到另一个 Activity ,但是一旦我点击后退按钮,相机就会变黑(见下文),我就无法
有没有办法为一个二维码创建多个 Action ? 目标是扫描二维码并执行这些操作: 连接WIFI 转至特定网址 我可以用 2 个二维码完成这 2 个操作,但只有一个会更容易 最佳答案 你不能。 仅仅是
在我的应用程序中,我需要实现 Blackberry Messenger 中可用的功能,即用户可以通过扫描他们的 QR 码来添加其他用户。 我找到了可以帮助生成二维码的库,也找到了线程来帮助生成二维码。
我尝试了新的 Google Play 服务功能 - 条码/QR 扫描仪。在 sample应用程序通过点击按钮开始扫描,结果也会在点击时返回。 有没有办法改变它的行为以立即返回第一个检测到的条形码/二维
我正在寻找解密(不仅是解码)二维码的逻辑。最近我看到几个加密二维码的应用程序,比如QuickMark。 .例如,此 QR 使用密码“pass”解密为“StackOverflow”: 如果你使用一个没有
我的公司有一个通过 URL 访问的社交网络平台。 我们正在尝试找到一种方法在体育商店中宣传我们的 URL,只有您来到商店才能访问我们的网站 - 我们不希望将 URL 分享给任何地方的任何人。 我们考虑
我想根据字段卷号生成一个二维码,并使用 JavaScript 文件(客户端验证)将其显示在 ID 名为“vyas_qrcode”的 div 容器中。 生成二维码的逻辑在js文件(qrcode_js.j
我正在研究使用 Android、iOS 和可能的 Windows Phone 上的浏览器扫描二维码的可用方法。理想的解决方案是拥有一个既可以在移动设备屏幕上又可以在全尺寸计算机屏幕上运行的 Ang
我正在开发 Instagram、Snap Chat 和 Facebook 等社交应用。我需要生成用户配置文件的二维码。我从数据库中隐藏了用户 ID。我的应用程序中有一个扫描仪来扫描二维码。该功能运行良
我有一个用于生成 jpeg 和 png 格式的二维码的代码,但还想在 PHP 中生成带有背景图像的 svg 二维码。我正在使用 qrlib.php 生成 jpeg 和 png 格式。 最佳答案 QRl
我正在使用 primefaces 开发网络应用程序。我正在尝试在网页上显示条形码。除了 QR 码外,所有编码器都显示了。我读到这需要两个 jar 文件 barcode4j: 2.1 qrgen:1.4
我正在寻找一个库或方法来解码二维码(或可能是另一种形式的二维条码)并能够实际确定相机的位置和方向。这似乎应该是可行的,但我不完全确定。 有谁知道最好的路线是什么?或者,如果它甚至可能? 最佳答案 zx
我正在尝试创建一个 QR 码,如果在安装了 Facebook 应用程序的手机上扫描,Facebook 应用程序将直接转到 QR 码中保存的类似页面。我尝试过什么this website已经说过了,但没
我使用python-qrcode和reportlab,我想生成一个二维码并显示它而不是将它保存为图像。 def member_card(request): response = HttpRes
好的,我正在使用这个 Javascript QR 代码生成器:https://github.com/davidshimjs/qrcodejs 开箱即用,您可以通过将其包含在页面上来获得字符串输出。
我在检测二维码在哪里时遇到问题。 我需要在它周围画边框。 我使用 AVMetadataObject 贝塞尔曲线路径,但它不起作用。 请帮助我。 - (void)captureOutput:(AVCap
我正在使用已弃用的 Camera 类。我在 onPreviewFrame(byte[] data, Camera camera) 方法中进行处理。 Zbar 扫描仪没有触发“尝试反向”扫描的选项。我发
1、搭个界面 2、写代码 ? 1
我正在尝试使用 pyqrcode 库生成一个 vCard 二维码,但我不知道该怎么做。 我已经阅读了他们的文档 5 次,其中没有提到 vCard,只提到了 URL,在互联网上,我只能找到关于 wifi
我是一名优秀的程序员,十分优秀!