微信支付有多种支付场景,有扫码支付、公众号支付、H5 支付、APP 应用支付等。

之前有写过一篇关于扫码支付的文章,今天,写一下关于公众号支付(jsapi支付)的一些知识。

我们在微信支付平台下载开发文档,其中,刷卡支付、公众号支付、扫码支付是统一放在一个压缩包里,压缩包为:WxpayAPI_php_v3。

将压缩包解压后,打开目录 example,其中,有二个文件是需要我们写业务代码的,一个jsapi.php 文件,这个文件主要用于获取用户的 openid 和传入支付的订单信息;

另一个文件是 notify.php,这个文件是支付成功后的回调文件,我们需要在这个文件里,写入支付成功后的业务逻辑,如更新订单状态为“已支付”。

一定要在支付平台设置支付授权目录,授权目录为要访问的文件所在目录,如:www.域名.com/zhifu/example/

实际操作:

1、当用户到达支付页面后,我们可以让用户点击支付按钮,当点击这个支付按钮后,我们将 order_id 这个参数传入到 jsapi.php 文件,在 jsapi.php 文件中,我们接收传入的 order_id ,重新查询订单信息。

2、我们将订单信息的关键内容,如需要支付的金额,产品的名称,放入到微信的参数中。

3、点击底部的支付按钮,唤醒微信的支付功能。

4、支付成功后,微信会访问到之前配置的回调地址文件。

jsapi.php 文件代码:

ini_set('date.timezone','Asia/Shanghai');

//error_reporting(E_ERROR);

require_once "../lib/WxPay.Api.php";

require_once "WxPay.JsApiPay.php";

require_once 'log.php';

//连接数据库

$servername = "localhost";

$username = "****";

$password = "****";

if (!$link = mysql_connect($servername, $username, $password)) {

echo 'Could not connect to mysql';

exit;

}

if (!mysql_select_db('****', $link)) {

echo 'Could not select database';

exit;

}

//根据传入的 order_id 获取订单信息

$order_id = $_GET['order_id'];

$sql = "SELECT * FROM v9_chongzhi_order where id={$order_id} ";

$result = mysql_query($sql, $link);

$order_info = mysql_fetch_assoc($result);

if($order_info['is_pay']==1){//如果订单已经支付,则直接跳走

header("Location:/index.php?m=member&c=index&from=mobile");

}

//初始化日志

$logHandler= new CLogFileHandler("../logs/".date('Y-m-d').'.log');

$log = Log::Init($logHandler, 15);

//打印输出数组信息

function printf_info($data)

{

foreach($data as $key=>$value){

echo "$key : $value
";

}

}

//①、获取用户openid

$tools = new JsApiPay();

$openId = $tools->GetOpenid();

//②、统一下单

$input = new WxPayUnifiedOrder();

$input->SetBody("充值");//这里传入的是商品信息

$input->SetAttach("chongzhi");

$input->SetOut_trade_no($order_info['sn']);//这里传入的是订单号

$input->SetTotal_fee($order_info['chongzhi_money']);//这里传入的是需要支付的金额

$input->SetTime_start(date("YmdHis"));

$input->SetTime_expire(date("YmdHis", time() + 600));

$input->SetGoods_tag("chongzhi");

$input->SetNotify_url("http://www.域名.com/zhifu/weixin/example/gongzhonghao_notify.php");

$input->SetTrade_type("JSAPI");

$input->SetOpenid($openId);

$order = WxPayApi::unifiedOrder($input);

echo '下单支付单信息
';

//printf_info($order_info);

echo "订单号 : {$order_info['sn']}
";

echo "充值金额 : ".($order_info['chongzhi_money']/100)." 元
";

$jsApiParameters = $tools->GetJsApiParameters($order);

//获取共享收货地址js函数参数

$editAddress = $tools->GetEditAddressParameters();

//③、在支持成功回调通知中处理成功之后的事宜,见 notify.php

/**

* 注意:

* 1、当你的回调地址不可访问的时候,回调通知会失败,可以通过查询订单来确认支付是否成功

* 2、jsapi支付时需要填入用户openid,WxPay.JsApiPay.php中有获取openid流程 (文档可以参考微信公众平台“网页授权接口”,

* 参考http://mp.weixin.qq.com/wiki/17/c0f37d5704f0b64713d5d2c37b468d75.html)

*/

?>

微信支付样例-支付

//调用微信JS api 支付

function jsApiCall()

{

WeixinJSBridge.invoke(

'getBrandWCPayRequest',

<?php echo $jsApiParameters; ?>,

function(res){

WeixinJSBridge.log(res.err_msg);

//alert(res.err_code+res.err_desc+res.err_msg);

}

);

}

function callpay()

{

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();

}

}

//获取共享地址

function editAddress()

{

WeixinJSBridge.invoke(

'editAddress',

<?php echo $editAddress; ?>,

function(res){

var value1 = res.proviceFirstStageName;

var value2 = res.addressCitySecondStageName;

var value3 = res.addressCountiesThirdStageName;

var value4 = res.addressDetailInfo;

var tel = res.telNumber;

//alert(value1 + value2 + value3 + value4 + ":" + tel);

}

);

}

window.onload = function(){

if (typeof WeixinJSBridge == "undefined"){

if( document.addEventListener ){

document.addEventListener('WeixinJSBridgeReady', editAddress, false);

}else if (document.attachEvent){

document.attachEvent('WeixinJSBridgeReady', editAddress);

document.attachEvent('onWeixinJSBridgeReady', editAddress);

}

}else{

editAddress();

}

};

该笔订单支付金额为<?php echo $order_info['chongzhi_money']/100; ?>元

<?php if($order_info['is_pay']==0){?>立即支付<?php } ?>

返回个人中心

notify.php 文件代码:

ini_set('date.timezone','Asia/Shanghai');

error_reporting(E_ERROR);

require_once "../lib/WxPay.Api.php";

require_once '../lib/WxPay.Notify.php';

require_once 'log.php';

//初始化日志

$logHandler= new CLogFileHandler("../logs/".date('Y-m-d').'.log');

$log = Log::Init($logHandler, 15);

class PayNotifyCallBack extends WxPayNotify

{

//查询订单

public function Queryorder($transaction_id)

{

$input = new WxPayOrderQuery();

$input->SetTransaction_id($transaction_id);

$result = WxPayApi::orderQuery($input);

Log::DEBUG("query:" . json_encode($result));

if(array_key_exists("return_code", $result)

&& array_key_exists("result_code", $result)

&& $result["return_code"] == "SUCCESS"

&& $result["result_code"] == "SUCCESS")

{

//在这里写关于支付后的业务逻辑,如更新订单状态

$servername = "localhost";

$username = "******";

$password = "******";

if (!$link = mysql_connect($servername, $username, $password)) {

echo 'Could not connect to mysql';

exit;

}

if (!mysql_select_db('*****', $link)) {

echo 'Could not select database';

exit;

}

$order_sn = $result['out_trade_no'];

$update_order_sql = "update chongzhi_order set pay_time={$result['time_end']},pay_amount={$result['total_fee']},is_pay=1 where sn='{$order_sn}' ";//echo $sql;

$update_order_result = mysql_query($update_order_sql, $link);

$order_sql = "SELECT * FROM chongzhi_order where sn='{$order_sn}' ";//echo $sql;

$order_result = mysql_query($order_sql, $link);

$order_info = mysql_fetch_assoc($order_result);

$chongzhi_money = round($result['total_fee']/100,2);

$update_amount_sql = "update member set amount=amount+{$chongzhi_money} where userid={$order_info['user_id']} ";//echo $sql;

$update_amount_result = mysql_query($update_amount_sql, $link);

return true;

}

return false;

}

//重写回调处理函数

public function NotifyProcess($data, &$msg)

{

Log::DEBUG("call back:" . json_encode($data));

$notfiyOutput = array();

if(!array_key_exists("transaction_id", $data)){

$msg = "输入参数不正确";

return false;

}

//查询订单,判断订单真实性

if(!$this->Queryorder($data["transaction_id"])){

$msg = "订单查询失败";

return false;

}

return true;

}

}

Log::DEBUG("begin notify");

$notify = new PayNotifyCallBack();

$notify->Handle(false);

结尾再次提醒:一定要在支付平台设置支付授权目录,授权目录为要访问的文件所在目录,如:www.域名.com/zhifu/example/

微信jsapi支付php环境,微信公众号支付(jsapi支付)相关推荐

  1. 微信公众号H5页面支付JSAPI

    1:在微信环境下,我们需要获取到code,拿code去获取openid,在获取openid的时候有2种参数分别是:snsapi_base和snsapi_userinfo,snsapi_base只为获取 ...

  2. C# MVC 微信支付教程系列之公众号支付

    微信支付教程系列之公众号支付   今天,我们接着讲微信支付的系列教程,前面,我们讲了这个微信红包和扫码支付.现在,我们讲讲这个公众号支付.公众号支付的应用环境常见的用户通过公众号,然后再通过公众号里面 ...

  3. PHP 支付PC端扫码支付、APP接口调起支付宝支付、微信公众号接入支付宝支付

    第一:第三方支付原理 第二:支付接口申请流程 地址:https://docs.open.alipay.com/270/105899/ : 参考地址:https://blog.csdn.net/nove ...

  4. 微信公众号:支付宝支付

    微信公众号:支付宝支付 微信公众号:支付宝支付 由于支付宝月微信是两个对立的企业,支付宝想介入微信的充值,微信发现就将其规避,在支付宝与微信博弈的过程中,双方一直是处于你争我赶的地步. 微信公众号接入 ...

  5. php 微信支付闪了一下,php,_微信公众号JS API支付,安卓没有效果(会闪一下就消失了),php - phpStudy...

    微信公众号JS API支付,安卓没有效果(会闪一下就消失了) 代码如下,ios可以支付,但是到安卓手机上就会出现微信支付读条(那三个点),然后就消失了,没有跳出输入密码支付的界面.... //调用微信 ...

  6. 微信公众号认证及支付开通流程

    记录一下公众号认证以及支付开通流程··· 微信认证流程官方链接==> http://kf.qq.com/product/weixinmp.html#hid=97 支付开通流程==> htt ...

  7. 微信小程序获取并展示公众号推文

    微信小程序获取并展示公众号推文 获取公众号access_token(开发环境) IP白名单设置 获取access_token 小程序前端展示 素材导入云数据库 云函数读取展示 注:笔者是小程序菜鸟,代 ...

  8. python pc微信 接收信息_GitHub - ericadver/WechatPCAPI: 微信PC版的API接口,可通过Python调用微信获取好友、群、公众号列表,并收发消息等功能。...

    WechatPCAPI 微信PC版的API接口,可通过Python调用微信获取好友.群.公众号列表,并收发消息等功能.可用于二次开发在线微信机器人.微信消息监控.群控软件.开发界面作多个微信控制软件等 ...

  9. python 微信公众号网页接口调用_GitHub - micsem00/WechatPCAPI: 微信PC版的API接口,可通过Python调用微信获取好友、群、公众号列表,并收发消息等功能。...

    WechatPCAPI 微信PC版的API接口,可通过Python调用微信获取好友.群.公众号列表,并收发消息等功能.可用于二次开发在线微信机器人.微信消息监控.群控软件.开发界面作多个微信控制软件等 ...

  10. python的读取微信界面_GitHub - lchb000/WechatPCAPI: 微信PC版的API接口,可通过Python调用微信获取好友、群、公众号列表,并收发消息等功能。...

    WechatPCAPI 微信PC版的API接口,可通过Python调用微信获取好友.群.公众号列表,并收发消息,接受转账.好友请求.入群请求,群管理等功能.可用于二次开发在线微信机器人.微信消息监控. ...

最新文章

  1. Magento 如何在注册页面调出Address Information
  2. Go 语言编程 — 程序结构
  3. vcenter6.0+EXSI6.0 部署虚拟机win10,安装vmtools后不能显示桌面
  4. python 建站需求_python建站基础环境配置
  5. MFC socket网络编程(流程示例)
  6. hbase获取表信息_HBase的读写和javaAPI的使用
  7. CentOS 6.4 命令行 安装 VMware Tools
  8. PreScan传感器(二)——TIS传感器
  9. ArcGIS中利用DEM制作山体阴影立体晕渲图调色附数据和在线视频教程
  10. c语言经典程序技能高考,计算机类技能高考介绍
  11. 微信小程序轮播图实现详解
  12. 航天宏图PIE-SAR软件高分3数据预处理流程
  13. XTU 1205 Range
  14. 2019年天梯赛第一阶段(1-8)全解
  15. 腾讯 2015年校招 笔试 附加题
  16. hr员工数据分析(实战)
  17. 【数据挖掘】《数据分析与数据挖掘》--天津大学公开课
  18. 名图怎么弄云服务器_名图怎么弄云服务器
  19. Linux内核编译的选项 m,编译内核选项!~~
  20. LayIM 3.9.1与ASP.NET SignalR实现Web聊天室快速入门(五)之使用RabbitMQ缓存消息

热门文章

  1. java-php-python-ssm企业产品在线展示销售平台计算机毕业设计
  2. 算法设计与分析[贪心]-汽车加油问题
  3. 酷派7295a官方底包优化刷机包 加入root权限省电稳定
  4. fragment 淡入淡出_Activity和Fragment的转场动画
  5. 基于Sqli-Labs靶场的SQL注入-第五关(重点讲双查询注入)
  6. 英伟达CEO黄仁勋对话OpenAI首席科学家,谈GPT-4及未来大模型
  7. PL/SQL删除锁表的进程
  8. 微信公众平台推广运营
  9. linux批量检查端口脚本,telnet批量检测端口状态(linux)
  10. KWS Water System Standard Rendering 教程