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版本紧跟微信小程序更新,在 ...
随机推荐
- 招新题流程简介(WS2812)
22物电科协软件招新题学习流程 有错误或者不当的地方请在评论区指出 题目简介 使用stm32驱动单一ws2812b灯珠实现呼吸灯效果,驱动及实现方法不限 演示效果 快速入门,在stm32核心板上点灯 ...
- 兼容url传参
//兼容url传参 if(java.nio.charset.Charset.forName("ISO-8859-1").newEncoder().canEnc ...
- 微信小程序开发常见问题
1.不同页面之间的传值方式 通过URL问号传值 当前页面 wx.navigateTo({ url: '/pages/aaa/aaa?/userName=norma' }) 2. 另一个页面通过opti ...
- 04 ajax执行php并传递参数
做这个事情之前要导入jQuery js的方式 _this.value1 = "abc"; _this.value2 = 1; $.ajax({ url: 'xxxxxx.php', ...
- 如何为linux kernel贡献代码
参考: Linux内核文档:<如何让你的改动进入内核> - 广漠飘羽 - 博客园 提交内核补丁到Linux社区的步骤 - 广漠飘羽 - 博客园 建议: 内容具有时效性,需要阅读最新版本的同 ...
- 通用CSS命名惯例
通用的 CSS 命名惯例 在参与规模庞大.历时漫长.且参与人数众多的项目时,要确保每一行代码都像是同一个人编写的:这就要求所有开发者,都遵守相同的代码规范.在先前的文章前端项目开发规范意见,从宏观角度 ...
- 2003031126-石升福-Python数据分析-五一假期作业
项目 内容 班级链接 20级数据班(本) 作业链接 五一假期作业 博客名称 2003031126-石升福-Python数据分析-五一假期作业 要求 每道题要有题目,代码(使用插入代码,不会插入代码的自 ...
- sql创建表时候单引号不是单引号是,而是Esc下面的按键
CREATE TABLE `test`.`testmd5` ( `id` INT ( 4 ) NOT NULL, `name` VARCHAR ( 20 ) NOT NULL, `pwd` VARCH ...
- Spring 笔记二 IOC
1.IOC IOC:Inversion od controller ,控制反转,控制的是资源的获取方式,由原来的自己创建 new 变成 Spring 容器创建. DI:Dependency In ...
- IT工具知识-14:如何通过adb操作安卓剪切板?
1.安装apk 下载地址 2.运行服务(每次重启系统都需要运行一次) adb shell am startservice ca.zgrs.clipper/.ClipboardService 3.设置剪 ...