PHP微信三方平台-代公众号发起微信支付(jsAPI)
一、前期准备工作
1、微信公众号需要开通微信支付认证将获取的秘钥给三方平台
2、添加支付回调域名地址:填写三方平台域名地址即可(最多5个)
二、代码demo
1、完成支付类
<?php
/**
* Created by PhpStorm.
* User: Administrator
* Date: 2017/9/20 0020
* Time: 17:25
*/ namespace app\models; class Payment
{ public static function WxPayInit($body, $trade_no, $total_fee, $open_id, $notify_url, $attach = [])
{ $post_params = [
'body' => $body,
'trade_no' => $trade_no,
'total_fee' => $total_fee * 100,
'open_id' => $open_id,
'attach' => $attach,
'notify_url' => \Yii::$app->request->hostInfo . \Yii::$app->request->scriptUrl . $notify_url
];
return self::WxPay($post_params);
} public static function WxPay($data)
{
$hywx_test = \Yii::$app->params['hywx_test'];
$pay_config = [
'APPID' => $hywx_test['app_id'],
'MCHID' => $hywx_test['mch_id'],
'MCHKEY' => $hywx_test['mch_key']
]; $attach = json_encode($data['attach']);
$input = new \WxPayUnifiedOrder();
$input->SetBody($data['body']);
$input->SetAttach($attach);
$input->SetOut_trade_no($data['trade_no']);
$input->SetTotal_fee($data['total_fee']);
$input->SetTime_start(date("YmdHis"));
$input->SetTime_expire(date("YmdHis", time() + 600));
$input->SetNotify_url($data['notify_url']);
$input->SetTrade_type("JSAPI");
$input->SetOpenid($data['open_id']);
$result = \WxPayApi::unifiedOrder($input, $pay_config);
if ($result['result_code'] == 'SUCCESS' && $result['return_code'] == 'SUCCESS') { $jsapi = new \WxPayJsApiPay();
$jsapi->SetAppid($result["appid"]);
$timeStamp = time();
$jsapi->SetTimeStamp("$timeStamp");
$jsapi->SetNonceStr(\WxPayApi::getNonceStr());
$jsapi->SetPackage("prepay_id=" . $result['prepay_id']);
$jsapi->SetSignType("MD5");
$jsapi->SetPaySign($jsapi->MakeSign( $hywx_test['mch_key']));
return $parameters = $jsapi->GetValues();
}
}
}
2、支付请求方法
require_once dirname(dirname(__FILE__)) . '/librarys/wx/wx_pay/lib/WxPay.Api.php';
require_once dirname(dirname(__FILE__)) . '/librarys/wx/wx_pay/lib/WxPay.Config.php';
require_once dirname(dirname(__FILE__)) . '/librarys/wx/wx_pay/lib/WxPay.NativePay.php'; public function actionTest()
{
$body = '欧式body';
$order_code = 'HY' . date('YmdHis');
$total_fee = 0.01;
$open_id = 'or-9g0kq0_p4FxCLMAWPg4ZPYX0k';//用户open_id
$notify_url = '/site/test-call-back';//回调地址
$jsApiParameters = Payment::WxPayInit($body, $order_code, $total_fee, $open_id, $notify_url);
$return_arr = [];
$return_arr['trade_no'] = $order_code;
$return_arr['jsApiParameters'] = $jsApiParameters;
return $this->renderJson($return_arr);
}
3、支付页面
<?php
/**
* Created by PhpStorm.
* User: LiDingLie
* Date: 2017/10/18 0018
* Time: 11:28
*/ use yii\helpers\Url; $web = Url::base();
$this->title = '订单支付';
$url = \app\librarys\Tools::urlBase();
?> <a href="javascript:" onclick="pay()" class="zf_btn">确定支付</a>
<script type="text/javascript" src="<?= $web ?>/js/jweixin-1.0.0.js"></script> <script type="text/javascript"> function pay() {
var baseUrl = '<?=$url?>'; requestJson(baseUrl + '/site/test', {}, true, function (response) {
if (response.status == 0) {
trade_no = response.data.trade_no;
var jsApiData = response.data.jsApiParameters;
// var wechat = JSON.parse(jsApiData);
callpay(jsApiData);
} else {
layer.msg(response.message);
}
});
} function callpay(wechat) {
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(wechat);
}
} function pollCode(wechat) {
var order_code = wechat.order_code;
var data = {};
data.order_code = order_code;
} function jsApiCall(wechat) {
WeixinJSBridge.invoke('getBrandWCPayRequest', {
'appId': wechat.appId,
'timeStamp': wechat.timeStamp,
'nonceStr': wechat.nonceStr,
'package': wechat.package,
'signType': wechat.signType,
'paySign': wechat.paySign
}, function (res) {
if (res.err_msg == 'get_brand_wcpay_request:ok') {
is_allow_pay = false;
// js轮训查询 是否支付成功
var setInt = setInterval(function () {
pollCode(wechat);
}, 1000); } else if (res.err_msg == 'get_brand_wcpay_request:cancel') {
layer.msg('取消支付成功'); //取消订单,作废报名记录
cancelPayTicketHandler(wechat.order_code);
} else {
layer.msg(res.err_msg);
}
});
}
</script>
PHP微信三方平台-代公众号发起微信支付(jsAPI)的更多相关文章
- 微信第三方平台代公众号发起网页授权 48001 api unauthorized 问题
https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&gr ...
- 微信支持的Authorization code授权模式(公众号开发)(开放平台资料中心中的代公众号发起网页授权)
链接:https://blog.csdn.net/ASZJBGD/article/details/82838356 主要流程分为两步: 1.获取code 2.通过code换取accesstoken 流 ...
- 微信公众号发起微信支付 c#
tenpay.dll: MD5Util.cs using System; using System.Collections.Generic; using System.Linq; using Syst ...
- 微信开放平台 公众号第三方平台开发 教程四 代公众号调用接口的SDK和demo
原文:微信开放平台 公众号第三方平台开发 教程四 代公众号调用接口的SDK和demo 教程导航: 微信开放平台 公众号第三方平台开发 教程一 平台介绍 微信开放平台 公众号第三方平台开发 教程二 创建 ...
- 公众号第三方平台开发 教程六 代公众号使用JS SDK说明
公众号第三方平台开发 教程一 创建公众号第三方平台 公众号第三方平台开发 教程二 component_verify_ticket和accessToken的获取 公众号第三方平台开发 教程三 微信公众号 ...
- JAVA开源微信管家平台——JeeWx捷微V3.3版本发布(支持微信公众号,微信企业号,支付窗)
JeeWx捷微V3.3版本紧跟微信小程序更新,在原有多触点版本基础上,引入了更多的新亮点:支持微信公众号.微信企业号.支付宝服务窗等多触点开发:采用微服务框架实现,可插拔可集成,轻量级开发:对小程序的 ...
- [5] 微信公众号开发 - 微信支付功能开发(网页JSAPI调用)
1.微信支付的流程 如下三张手机截图,我们在微信网页端看到的支付,表面上看到的是 "点击支付按钮 - 弹出支付框 - 支付成功后出现提示页面",实际上的核心处理过程是: 点击支付按 ...
- .NET Core之微信支付之公众号、H5支付篇
前言 本篇主要记录微信支付中公众号及H5支付全过程. 准备篇 公众号或者服务号(并开通微信支付功能).商户平台中开通JSAPI支付.H5支付. 配置篇 公众号或者服务号中 -------开发----- ...
- JAVA版开源微信管家—JeeWx捷微3.2版本发布,支持微信公众号,微信企业号,支付窗、小程序
JeeWx捷微3.2微信企业号升级版本发布^_^ JeeWx捷微V3.2——多触点管理平台(支持微信公众号,微信企业号,支付窗.小程序) JeeWx捷微V3.2.0版本引入了更多新特性,支持微信公 ...
- JeeWx捷微3.1小程序版本发布,支持微信公众号,微信企业号,支付窗——JAVA版开源微信管家
支持小程序,JeeWx捷微3.1小程序版本发布^_^ JeeWx捷微V3.1——多触点小程序版本管理平台(支持微信公众号,微信企业号,支付窗) JeeWx捷微V3.1.0版本紧跟微信小程序更新,在 ...
随机推荐
- react文件分片上传
参考文档: https://blog.csdn.net/weixin_39887846/article/details/113492372 https://juejin.cn/post/6844904 ...
- 当jar包执行时,内嵌的文件找不到时,可以这样解决!
1.加载是可以加载到的,但是只能是以流的形式存在. 2.如果要按文件进行加载,可以新建一个文件,然后以流的形式写入到新的文件中. 3.加载这个新的文件来进行处理.
- guava缓存
Guava Cache有一些优点如下 :1. 线程安全的缓存, 与ConcurrentMap相似(前者更"好"), 在高并发情况下.能够正常缓存更新以及返回.2. 提供了三种基本的 ...
- PLC入门笔记9
梯形图电路之电机控制 电机直接启动控制电路 电机正反停控制电路 我的图.. 但愿最后说的不要发生吧 例如下错了程序 导致... 最好外部电路互锁一下.. 电机故障判断电路 我的图.. 电机故障转换电路 ...
- error: You must be logged in to the server (Unauthorized) 问题处理
故障现象: 执行kubectl 命令时: 提示"error: You must be logged in to the server (Unauthorized)" 分析: 权限问 ...
- lgb文档学习
1.L1和l2损失是什么意思? 相较于MSE,MAE有个优点,那就是MAE对离群值不那么敏感,可以更好地拟合线性,因为MAE计算的是误差y−f(x)的绝对值,对于任意大小的差值,其惩罚都是固定的. 2 ...
- 2.5基本算法之搜索 156:LETTERS
#include<iostream>#include<cstdio>using namespace std;char a[21][21];bool b[26]; int X[4 ...
- Linux习题
1.判断/etc/inittab文件是否大于100行,如果大于,则显示"/etc/inittab is a big file."否者显示"/etc/inittab is ...
- IOS文件下载时,文件名的处理
string contentType = MimeMapping.GetMimeMapping(name);var isIOS = false; if (Request.UserAgent != nu ...
- ESP32 环境搭建以及入门编程流程和体验-windows
本帖适合入门级人员,但同时欢迎新老读者批评指正. 某宝上买了个esp32,还有一本ESP32开发指南的书. 然后就是环境搭建.上面写的主要是linux上的,我在自己的orange pi pc开发板上搭 ...