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版本紧跟微信小程序更新,在 ...
随机推荐
- linux修改网络
如何修改ip 临时方法: ifconfig DIVICE IP netmask NETMASK 知识临时修改ip,重启或重启网络恢复 在一个网卡上设置多个ip ifconfig DEVICE:NUMB ...
- PHP Redis - List (列表)
Redis列表是简单的字符串列表,按照插入顺序排序. 一个列表最多可以包含 232-1 个元素 (4294967295, 每个列表超过40亿个元素) 插入元素在列表头部(lPush,Lpushx) ...
- SQL IIF函数的使用 判断为空数据不显示的问题
先说说IIF函数 IIF函数 需要一个条件 两个值 当条件满足的时候 执行第一个值 条件不满足的时候 执行第二个值 IIF(判断条件,值1,值2) 今天判断数据的时候 发现当值为NULL或者为' ...
- Docker系列--Docker设置系统资源限制及验证
1.限制容器的资源 默认情况下,容器没有资源限制,可以使用主机内核调度程序允许的尽可能多的给定资源.Docker提供了控制容器可以使用多少内存或CPU的方法,设置docker run命令的运行时配置标 ...
- StarUML画用例图
好久没画图在StarUML里都找不到useCase了,记下来不然又忘了 右击Untitled->Add Diagram->UseCase Diagram,然后左边就有UseCase了就可以 ...
- 国际化vue-i18n 向语言包中传入参数
模板 <span>{{$t('el.table.total', { pagetotal: 123 })}}</span> js代码中 this.$t('el.table.num ...
- Ubuntu实战
Ubuntu是什么 Ubuntu早期是一个由Debian Linux发展起来的以桌面应用为主的操作系统.作为Linux发行版中的后起 之秀,Ubuntu Linux在短短几年时间里便迅速成长为从Lin ...
- maven工程入门
1. 为什么要使用maven? 毕业开始工作,项目组用的maven-spring开发的,不得不了解一下,看过很多介绍,其中maven最大的特点就是 管理jar包和版本管理 (参考:https://ww ...
- linux-usermod
添加组成员 sudo usermod -aG <targetgroup> <selfuser>
- 如何用算法把一个十进制数转为十六进制数-C语言基础
这一篇文章要探讨的是"如何用算法实现十进制转十六进制"并不涉及什么特别的知识点.属于C语言基础篇. 在翻找素材的时候,发现一篇以前写的挺有意思的代码,这篇代码里面涉及的知识点没有什 ...