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版本紧跟微信小程序更新,在 ...
随机推荐
- luogu 4886
点分治好题 统计距离正常点分治统计即可,我们只需考虑何时达到最优 有两种情况: 第一:代价最大的询问两个端点在不同的两个子树中 因为这种情况下,无论根向那个子树移动都会等价地增加到达另一个端点的代价, ...
- 05 js利用ajax向服务器发送请求并返回json值
创建一个php $json = '';$data = array();$con =mysqli_connect($servername, $username, $password, $dbname); ...
- 【jinja2】Python根据模板生成HTML文件并加载进QWebEngineView
前言 继前文Python在PyQt5中使用ECharts绘制图表中在Python程序中添加网页展示ECharts图表,和Python使用QWebEngineView时报错Uncaught Refere ...
- Jmeter七、jmeter中的参数化
参数化是为了更好的模拟真实的业务场景 CSV data set config组件 1.更容易使用和理解 2.适合大参数量场景 3.设置方便灵活 EOF=end of file 没有找到文件 comma ...
- obs问题记录
1.安装obs后,可能无法使用,需要下载dll文件,我的阿里云盘中有: 2.录制时电脑没电会报错'编码器错误': 3.插上声卡后播放视频想听到声音需要在声卡上插耳机听: 4.
- 后台调用 WEBAPI 几种方式
示例是调用谷歌短网址的API. 1. HttpClient方式: public static async void DoAsyncPost() { DateTime dateBegin = DateT ...
- 杭电OJ刷题指南(ACM)
杭州电子科技大学Oj是著名的算法竞赛刷题网站!!
- java绘图技术

- spring中事物是怎么实现的?
Spring容器事务 声明式和编程式 当需要用到事务操作的地方很少的时候,那么就可以使用编程方式 TransactionTemplate,它不会建立很多事务代理.但是,如果程序中用到大力的事务操作,声 ...
- SpringBoot+MybatisPlus 多数据源问题
SpringBoot+Mybatis 多数据源报错 使用了2个数据源 @Bean("dataSource") @ConfigurationProperties(prefix = & ...