一、前期准备工作

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)的更多相关文章

  1. 微信第三方平台代公众号发起网页授权 48001 api unauthorized 问题

    https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&gr ...

  2. 微信支持的Authorization code授权模式(公众号开发)(开放平台资料中心中的代公众号发起网页授权)

    链接:https://blog.csdn.net/ASZJBGD/article/details/82838356 主要流程分为两步: 1.获取code 2.通过code换取accesstoken 流 ...

  3. 微信公众号发起微信支付 c#

    tenpay.dll: MD5Util.cs using System; using System.Collections.Generic; using System.Linq; using Syst ...

  4. 微信开放平台 公众号第三方平台开发 教程四 代公众号调用接口的SDK和demo

    原文:微信开放平台 公众号第三方平台开发 教程四 代公众号调用接口的SDK和demo 教程导航: 微信开放平台 公众号第三方平台开发 教程一 平台介绍 微信开放平台 公众号第三方平台开发 教程二 创建 ...

  5. 公众号第三方平台开发 教程六 代公众号使用JS SDK说明

    公众号第三方平台开发 教程一 创建公众号第三方平台 公众号第三方平台开发 教程二 component_verify_ticket和accessToken的获取 公众号第三方平台开发 教程三 微信公众号 ...

  6. JAVA开源微信管家平台——JeeWx捷微V3.3版本发布(支持微信公众号,微信企业号,支付窗)

    JeeWx捷微V3.3版本紧跟微信小程序更新,在原有多触点版本基础上,引入了更多的新亮点:支持微信公众号.微信企业号.支付宝服务窗等多触点开发:采用微服务框架实现,可插拔可集成,轻量级开发:对小程序的 ...

  7. [5] 微信公众号开发 - 微信支付功能开发(网页JSAPI调用)

    1.微信支付的流程 如下三张手机截图,我们在微信网页端看到的支付,表面上看到的是 "点击支付按钮 - 弹出支付框 - 支付成功后出现提示页面",实际上的核心处理过程是: 点击支付按 ...

  8. .NET Core之微信支付之公众号、H5支付篇

    前言 本篇主要记录微信支付中公众号及H5支付全过程. 准备篇 公众号或者服务号(并开通微信支付功能).商户平台中开通JSAPI支付.H5支付. 配置篇 公众号或者服务号中 -------开发----- ...

  9. JAVA版开源微信管家—JeeWx捷微3.2版本发布,支持微信公众号,微信企业号,支付窗、小程序

    JeeWx捷微3.2微信企业号升级版本发布^_^ JeeWx捷微V3.2——多触点管理平台(支持微信公众号,微信企业号,支付窗.小程序)   JeeWx捷微V3.2.0版本引入了更多新特性,支持微信公 ...

  10. JeeWx捷微3.1小程序版本发布,支持微信公众号,微信企业号,支付窗——JAVA版开源微信管家

    支持小程序,JeeWx捷微3.1小程序版本发布^_^ JeeWx捷微V3.1——多触点小程序版本管理平台(支持微信公众号,微信企业号,支付窗)   JeeWx捷微V3.1.0版本紧跟微信小程序更新,在 ...

随机推荐

  1. 48. Rotate Image via java

    need to use scratch to find the pattern class Solution { public void rotate(int[][] matrix) { int n= ...

  2. 训练题——OLED部分

    训练题OLED部分 实现目标 通过IIC通信控制OLED屏幕显示出一串字符串 名词介绍 OLED屏: OLED(Organic Light-Emitting Diode),又称为有机电激光显示.有机发 ...

  3. FFT简单概述

    概念 快速傅里叶变换 (fast Fourier transform), 即利用计算机计算离散傅里叶变换(DFT)的高效.快速计算方法的统称,简称FFT.快速傅里叶变换是1965年由J.W.库利和T. ...

  4. 关于集合set、数据类型转换等

  5. vue后台管理系统——登录/退出功能

    电商后台管理系统的功能--登录/退出功能 1. 登录业务流程 ① 在登录页面输入用户名和密码 ② 调用后台接口进行验证 ③ 通过验证之后,根据后台的响应状态跳转到项目主页 2. 登录业务的相关技术点 ...

  6. AX2012 使用HTML自定义popup内样式

    在Class Box下新增方法如下: public client static DialogButton yesNoHTML( str _text, DialogButton _defaultButt ...

  7. C# core 流、字节、字符串相互转换

    /// <summary> /// 将 Stream 转成 byte[] /// </summary> public byte[] StreamToBytes(Stream s ...

  8. Servlet执行步骤

    <!-- 1. 用户发请求,action=add 2. 项目中,web.xml中找到url-pattern = /add -> 第12行 3. 找第11行的servlet-name = A ...

  9. 如何卸载cad 2022?怎么把cad 2022彻底卸载删除干净重新安装的方法【转载】

    标题:cad 2022重新安装方法经验总结,利用卸载清理工具完全彻底排查删除干净cad 2022各种残留注册表和文件.cad 2022显示已安装或者报错出现提示安装未完成某些产品无法安装的问题,怎么完 ...

  10. javascript数据类型,定义方法,(工厂模式及闭包的应用)

    js数据类型分为两大类:一  值类型                                        二 引用类型 一 值类型  string  number  boolean null ...