微信公众号jsapi支付php源码分析

微信公众号支付,首先需要通过授权跳转地址里获取code,并进一步向微信获取openid,然后拉起统一支付获取prepay_id,然后再等待用户按下支付,调起支付。支付部分在前端,很多初次使用微信公众号支付的人人对获取code和opendi部分不懂,微信的php,java等demo源代码地址如下

https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=11_1。

微信支付的演示地址(在微信内复制黏贴后点击打开)http://paysdk.weixin.qq.com/

选择jsapi后,会进入https://open.weixin.qq.com/connect/oauth2/authorize?appid=wx426b3015555a46be&redirect_uri=http%3A%2F%2Fpaysdk.weixin.qq.com%2Fexample%2Fjsapi.php&response_type=code&scope=snsapi_base&state=STATE#wechat_redirect

我们发现微信自身提供的跳转地址是http://paysdk.weixin.qq.com/example/jsapi.php这个地址,这样你可以在上面微信的源代码里的example下找到jsapi.php这个页面,下面就是我对这个Php页面和相关调用的一个梳理和分析,值分析获取opendi到得到prepay_id的过程,支付在最下面一段

<?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‘;

//初始化日志

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

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

//打印输出数组信息

function printf_info($data)

{

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

echo "<font color=‘#00ff55;‘>$key</font> : $value <br/>";

}

}

//①、获取用户openid

//example/JsApiPay.php里有这个JsApiPay这个类,里面含有获取opendi的函数GetOpenid,

//这个函数首先获取微信传入的code,进一步利用getOpenidFromMp($code)函数向微信服务器获取openid

$tools = new JsApiPay();

$openId = $tools->GetOpenid();

//②、统一下单

$input = new WxPayUnifiedOrder(); //定义在lib Wepay.Data.php里

$input->SetBody("test");

$input->SetAttach("test");

$input->SetOut_trade_no(WxPayConfig::MCHID.date("YmdHis"));

$input->SetTotal_fee("1");

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

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

$input->SetGoods_tag("test");

$input->SetNotify_url("http://paysdk.weixin.qq.com/example/notify.php");

$input->SetTrade_type("JSAPI");

$input->SetOpenid($openId);

//上面将需要发送到微信服务器进行统一支付的body, attach, trade_no,fee,通知地址等填写在定义在lib下面的Wepay.Data.php里的WxPayUnifiedOrder类的实例$input里,

//然后定义在lib WxPay.Api.php里的WxPayApi类里有个一个unifiedOrder函数,首先判断是否填//写以上各项数据,没有爆出异常,然后在下面的

$order = WxPayApi::unifiedOrder($input);里进一步填写关键的公众号APPID,商户号MCHID,KEY ,APPSECRET(这些作为静态数据放在lib WxPay.Config.php里) ,用户的ip要前台传递给后台,随机字符串和签名在该函数里调用了相应函数进行了获取。

//然后通过该函数里又调用了两个函数将数据封装成xml发送到微信服务器,并将微信响应的含有prepay_id的结果返回,在这里就赋值给了$order,这时的$order是统一下单后的微信返回结果 下面是unifiedOrder函数最后几行

/*

参见 lib WxPay.Api.php 函数 unifiedOrder函数

$xml = $inputObj->ToXml();//将上面$input的统一支付各个数据封装成xml,发送给微信,获取Prepaid_id等

$response = self::postXmlCurl($xml, $url, false, $timeOut);

//发起统一下单,向微信提供的统一下单地址发送填写了各种参数的xml,并获得响应结果

$result = WxPayResults::Init($response); return result;

*/

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

//这时候$order含有了prepaid_id等微信返回数据

echo ‘<font color="#f00"><b>统一下单支付单信息</b></font><br/>‘;

printf_info($order);

//GetJsApiParameters抽取各项返回数据,封装成json,用于在填充下面的发起对微信支付invoke里所需要传送的数据

$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)

*/

?>

<html>

<head>

<meta http-equiv="content-type" content="text/html;charset=utf-8"/>

<meta name="viewport" content="width=device-width, initial-scale=1"/>

<title>微信支付样例-支付</title>

<script type="text/javascript">

//调用微信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();

}

};

</script>

</head>

<body>

<br/>

<font color="#9ACD32"><b>该笔订单支付金额为<span style="color:#f00;font-size:50px">1分</span>钱</b></font><br/><br/>

<div align="center">

<button style="width:210px; height:50px; border-radius: 15px; border:0px #FE6714 solid; cursor: pointer;  color:white;  font-size:16px;" type="button" onclick="callpay()" >立即支付</button>

</div>

</body>

</html>

时间: 2024-07-29 19:31:09

微信公众号jsapi支付php源码分析的相关文章

微信公众号JSAPI支付

微信公众号JSAPI支付 一:配置参数 申请成功后,获取接口文件, 将所有文件放入项目根目录weixin下,在WxPay.ub.config.php中填入配置账户信息; 二:设置授权 开发者中心->网页服务->网页授权获取用户基本信息->修改; “授权回调页面域名修改成你的域名地址即可,须保证网页授权已获得,不然会报redirect_uri 参数错误; 三:网页授权获取用户openid js_api_call.php 请求文件中改动(所有传给微信的参数都在入口文件中接收) $out_tr

PHP微信公众号JSAPI网页支付(下)

上一篇<a id="cb_post_title_url" class="postTitle2" href="http://www.cnblogs.com/hld123/p/6626323.html">PHP微信公众号JSAPI网页支付(上)</a>中讲到了公众号平台的相关设置以及支付的大致流程. 这一篇重点讲支付后,异步接受回调通知,以及处理后同步通知微信服务器. 首先梳理下整个jsapi支付的流程 1.网页授权获取用户o

微信公众号H5支付-JAVA版

微信开发之微信公众号H5支付-JAVA版 引子 从事JAVA开发一年多了,一直都在看博客园,CSDN的博客,从很多前人哪里学习了很多,突然觉得自己也要尽一份力,写点博客自己给自己做做记录,也给要开发微信人提提醒少遇点坑. 很多人开发微信的时候,总是在抱怨微信的开发文档很坑,里面的参数和使用方式很含糊,其实有时候自己想想,如果自己去研发API的时候,是否能够做的比微信更好呢?,大师都有一颗虔诚学徒的心,希望这篇文档能给予从事微信公众号H5支付焦头烂额的朋友,一点帮助. 一.前言 先给大家提提从事微

h5棋牌游戏公众号开发 app开发+源码平台搭建分享教程

h5棋牌游戏公众号开发 app开发+源码平台搭建分享教程下载diguaym.com/h5 扣扣2152876294 多合一集合游戏 聚集了h5牛牛.金花.二杠八.十三水.三公等 全新界面UI设计(WeChat H5 public number landlords chess source development, Download diguaym.com/h5 buckle more than 2747044651 in one set of game 要建立一个安全Linux服务器就首先要了解

微信公众号JSAPI网页支付

一.使用场景以及说明 使用场景:商户已有H5商城网站,用户通过消息或扫描二维码在微信内打开网页时,可以调用微信支付完成下单购买的流程. 说明:用户打开图文消息戒者扫描二维码,在微信内置浏览器打开网页进行的支付.商户网页前端通过使用微信提供的 JS API,调用微信支付模块.这种方式,适合需要在商户网页进行选购下单的购买流程. 二.准备工作 公共号支付需要提前在微信公共平台进行业务配置,包括设置支付授权目录.设置JS接口安全域名以及设置授权回调页面域名. 1.进行微信公众支付之前,我们需要申请个公

微信小程序与微信公众号之间支付问题解决方案

前言 大家好,我是一名对编程有兴趣的小伙子,IT届称我为xiager,工作中叫我jake 就好了,如果此文对你有帮助希望多多关注哦. 准备 微信公众平台 微信支付平台 微信开放平台 一. 小程序    二 微信公众号 两个微信支付绑定同一个商户号 1.微信支付平台 产品中心 授权目录要添加根目录并准确  要用https 形式 否则小程序内不支持 http形式的. 2.小程序中js授权等域名 填写一致  微信公众号网页授权地址一致 3.在jsapi支付的时候切记一定传openid.  在微信浏览器

微信公众号在线生成二维码带参数怎么搞?

带参数二维码是微信公众号渠道二维码的一种实现 微信的带参数二维码有两种,一种是临时二维码,一种是永久二维码,但是永久二维码的生成是有个数限制的,微号帮功能实现生成二维码海报.渠道二维码生成,确保公众号在合适的场景使用合适的功能 渠道二维码功能 推广员二维码 推广员二维码生成后 海报二维码功能 海报二维码效果数据 海报二维码推广员(即参加海报二维码推广的人) 用户通过二维码进入,自动回复信息支持文字.图片.单图文.小程序等信息格式,图文信息可以指向任意URL:推送给用户,实时监控到二维码来源的所有

项目中微信公众号调取支付控件demo

微信支付官方文档:https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=7_7&index=6 前端代码demo (JSP页面): <%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%> <%@ taglib prefix="c&quo

微信公众号带参数二维码怎么生成?

微信公众平台提供了生成带参数二维码的接口.使用该接口可以获得多个带不同场景值的二维码,用户扫描后,公众号可以接收到事件推送.二维码分为临时二维码和永久二维码!就算你不用代码也没关系,使用微号帮平台渠道二维码生成,轻松完成带参数二维码生成 1.登录微号帮平台操作 已注册用户,输入用户名密码登录即可:未注册用户,点击注册按钮注册一个即可. 2.选择要生成带参数二维码的服务号选择微号帮服务号,已微信认证的服务号才有生成带参数二维码的功能 3.选择渠道二维码生成即带参数二维码生成进入这个功能后,可以生成