PHP实现微信支付(jsapi支付)流程步骤详解

最近接触到一个项目,涉及到微信支付,搞微信开发这么久以来,还没搞过支付,之前也就搞过公众号发红包,感谢前辈们的探索,我看了他们的博文,让我少走了很多弯路。

前期准备:

1.微信认证服务号,并且开通了微信支付

2.微信支付SDK,下载地址:https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=11_1

3.登录微信支付平台https://pay.weixin.qq.com/index.php/account/api_cert下载支付证书

方法步骤:

1.demo文件处理

(1)将官方的demo下载下来,文件名为WxpayAPI_php_v3,把这文件重命名为wxpay,为了后边书写目录方便;

(2)打开lib文件夹下的WxPay.Api.php文件,在537行有一段curl网络请求配置代码:

curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,TRUE);
curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,2);//严格校验 

替换成:

curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,FALSE);
curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,2);//严格校验

为了禁止 cURL 验证对等证书(peer's certificate)。

(3)打开lib文件夹下的WxPay.Config.php文件,第25行开始,根据自己的账号完成基本信息设置;

const APPID = '公众账号APPID';
const MCHID = '商户号';
const KEY = '商户支付密钥';
const APPSECRET = '公众帐号secert'; 

(4)打开lib文件夹下的WxPay.Notify.php文件,第79行的代码:

if($needSign == true &&
 $this->GetReturn_code($return_code) == "SUCCESS")
{
 $this->SetSign();
} 

改成:

if($needSign == true &&
 $this->GetReturn_code() == "SUCCESS")
{
 $this->SetSign();
} 

(5)打开cert证书目录,将里边的两个证书换成自己的支付证书。

2.公众号后台设置

(1)配置网页授权域名,我的域名是(xy.chuyin.ren);

(1)配置支付授权目录,域名是(xy.chuyin.ren),我将demo放到此域名指向的目录的weixinopen/文件夹下,demo中jsapi.php文件位于example/目录下,所以支付授权目录为:xy.chuyin.ren/weixinopen/wxpay/example/

3.支付流程

打开example目录下的jsapi.php文件,支付发起和处理,都是在这里完成。

(1)获取用户openid

之前配置好了自己的APPID和APPSecert,所以这里不用处理。

//①、获取用户openid
$tools = new JsApiPay();
$openId = $tools->GetOpenid(); 

这里首先初始化的一个JsApiPay()类得到一个对象,文件对应example/目录下的WxPay.JsApiPay.php,调用GetOpenid()方法,会自动获取自己的openID。

(2)统一下单

//②、统一下单
$input = new WxPayUnifiedOrder();
$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);
$order = WxPayApi::unifiedOrder($input);
echo '<font color="#f00"><b>统一下单支付单信息</b></font><br/>';
printf_info($order);
$jsApiParameters = $tools->GetJsApiParameters($order); 

对应WxPay.Api.php的第24行的unifiedOrder()方法,配置订单信息和支付回调函数,这里需要修改几个参数:

A. 商品名称:

$input->SetBody("test"); 

B. 订单号

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

C. 支付金额

$input->SetTotal_fee("1");

D. 支付验证链接

设置为你的notify.php文件所在的位置,所以我这里设置为:http://xy.chuyin.ren/weixinopen/wxpay/example/notify.php

也可以写其他地址,当然要在支付授权域名之下,支付成功之后就会自动回调到该链接指定的方法里边,可以在里边进行判断和数据库操作.

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

E. 附加参数

$input->SetAttach("test"); 

附加参数,可填可不填,填写的话,里边字符串最好不要出现空格。

这时候,点击支付应该就可以成功支付了。

(3)发起支付

<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();
 }
}
</script> 

点击立即支付按钮调用的就是 callpay() 函数,他有会调用jsApiCall() 函数打开支付程序。

jsApiCall() 函数会监听每一步动作:

 res.err_msg 为get_brand_wcpay_request:cancel 表明前端判断的取消支付,es.err_msg 为get_brand_wcpay_request:ok 表明前端判断的支付成功,我们可以根据这个将支付跳转到成功页面。

(4)支持成功回调

通过前端jsApiCall()函数可以监听支付结果,但是这个并不可信。确认是否支付成功还是应当通过notify.php 处理业务逻辑。前边配置好了支付验证链接SetNotify_url(),支付完成后,微信服务器会根据链接自动请求你的notify.php文件,打开这个文件,其实这个文件最主要的代码就两行:

$notify = new PayNotifyCallBack();
$notify->Handle(false); 

由此跟踪到WxPay.Notify.php类文件的Handle()函数:

/**
 *
 * 回调入口
 * @param bool $needSign 是否需要签名输出
 */
final public function Handle($needSign = true)
{
 $msg = "OK";
 //当返回false的时候,表示notify中调用NotifyCallBack回调失败获取签名校验失败,此时直接回复失败
 $result = WxpayApi::notify(array($this, 'NotifyCallBack'), $msg);
 if($result == false){
  $this->SetReturn_code("FAIL");
  $this->SetReturn_msg($msg);
  $this->ReplyNotify(false);
  return;
 } else {
  //该分支在成功回调到NotifyCallBack方法,处理完成之后流程
  $this->SetReturn_code("SUCCESS");
  $this->SetReturn_msg("OK");
 }
 $this->ReplyNotify($needSign);
} 

主要代码:

$result = WxpayApi::notify(array($this, 'NotifyCallBack'), $msg); 

然后来到WxPay.Api.php文件的第411行,notify()函数:

/**
 *
 * 支付结果通用通知
 * @param function $callback
 * 直接回调函数使用方法: notify(you_function);
 * 回调类成员函数方法:notify(array($this, you_function));
 * $callback 原型为:function function_name($data){}
 */
public static function notify($callback, &$msg)
{
 //获取通知的数据
 $xml = $GLOBALS['HTTP_RAW_POST_DATA'];
 //file_put_contents('log.txt',$xml,FILE_APPEND);
 //如果返回成功则验证签名
 try {
  $result = WxPayResults::Init($xml);
 } catch (WxPayException $e){
  $msg = $e->errorMessage();
  return false;
 } 

 return call_user_func($callback, $result);
} 

这里面的$xml=$GLOBALS['HTTP_RAW_POST_DATA'],就是支付成功后用户返回给你的一个结果,他是一个xml格式的字符串。

我们可以将这里返回的xml数据记录下来,然后打开看看$out_trade_no就是在支付之前我自己设置的订单号码,$attach就是设置的附加参数。

得到了这个订单号,然后我就直接在下面写支付成功后的逻辑了,比如改变数据库中的数据等等。

这样 微信支付的 JsApi支付就大致分析完成了。

这是集成了官方的SDK实现的,如果不使用SDK,可以使用更简单的方法,见:PHP实现微信支付(jsapi支付)和退款(无需集成支付SDK)

总结

以上所述是小编给大家介绍的PHP实现微信支付(jsapi支付)流程步骤详解,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对我们网站的支持!

您可能感兴趣的文章:

  • PHP实现微信支付(jsapi支付)和退款(无需集成支付SDK)流程教程详解
  • 微信JSAPI支付操作需要注意的细节
  • 微信公众号支付之坑:调用支付jsapi缺少参数 timeStamp等错误解决方法
  • Java通过JsApi方式实现微信支付
  • ThinkPHP实现微信支付(jsapi支付)流程教程详解
(0)

相关推荐

  • 微信公众号支付之坑:调用支付jsapi缺少参数 timeStamp等错误解决方法

    这段时间一直比较忙,一忙起来真感觉自己就只是一台挣钱的机器了(说的好像能挣到多少钱似的,呵呵):这会儿难得有点儿空闲时间,想把前段时间开发微信公众号支付遇到问题及解决方法跟大家分享下,这些"暗坑"能不掉就不掉吧,要不然关键时刻出问题,真是让人急的焦头烂额. 双12客户的商城活动正在蓄势进行中,却有用户频频反馈说:支付不了,有问题,并截图如下: 当时问题感觉很奇怪,自己测试多次都ok啊,问题来了都赶紧解决吧,最终找到解决办法: 原因是程序中一个字符串变量被错误的设置为数字类型,解决方法很

  • 微信JSAPI支付操作需要注意的细节

    首先介绍一下我在调用微信支付接口使用的是 weixin.senparc SDK,非常方便好用开源的一个微信开发SDK. weixin.senparc SDK 官网:http://weixin.senparc.com/ 先去下载下来Senparc.Weixin SDK. 在调起支付接口之前,需要先要调用统一下单接口,商户系统先调用该接口在微信支付服务后台生成预支付交易单,返回正确的预支付交易回话标识后再在APP里面调起支付. 微信 JsApi支付 在这个目录下 Senparc.Weixin.MP.

  • ThinkPHP实现微信支付(jsapi支付)流程教程详解

    之前写过一篇文章讲了PHP实现微信支付(jsapi支付)流程 ,详见文章:PHP实现微信支付(jsapi支付)流程. 当时的环境是没有使用框架的,直接在一个域名指向的目录下边新建目录之后访问该目录实现的,但应用到框架中,还是有一些问题,在ThinkPHP中,由于路由规则与支付授权目录有出入,所以会报错.本篇讲讲在TP中集成微信支付的流程. 鹅厂出的SDK和文档,就是让你看不懂,使劲绕,这酸爽用了就知道.文档和SDK不是应该越简单通俗易懂越好么?难道只有使劲重构才能显示出鹅厂程序猿技术的高超咩?额

  • Java通过JsApi方式实现微信支付

    要使用JsApi进行微信支付,首先要从微信获得一个prepay_id,然后通过调用微信的jsapi完成支付,JS API的返回结果get_brand_wcpay_request:ok仅在用户成功完成支付时返回.由于前端交互复杂,get_brand_wcpay_request:cancel或者get_brand_wcpay_request:fail可以统一处理为用户遇到错误或者主动放弃,不必细化区分. 示例代码如下: function onBridgeReady(){ WeixinJSBridge

  • PHP实现微信支付(jsapi支付)和退款(无需集成支付SDK)流程教程详解

    之前有写过几篇文章将微信支付和退款: 1.PHP实现微信支付(jsapi支付)流程 2.ThinkPHP中实现微信支付(jsapi支付)流程 3.PHP实现微信申请退款 这几篇都是使用了微信官方给的PHP版本的SDK,进行支付的时候写代码可以省不少事,步骤也挺简化,但是集成SDK有很多坑,很多人说引入的SDK老报错,或者说官方SDK本身有不少错误,改起来很麻烦,也确实挺麻烦的,对于新手搞支付很容易被绕进去,那么今天就来讲讲不集成支付SDK直接调用支付接口实现支付和退款. 前期准备: 1.当然了,

  • PHP实现微信支付(jsapi支付)流程步骤详解

    最近接触到一个项目,涉及到微信支付,搞微信开发这么久以来,还没搞过支付,之前也就搞过公众号发红包,感谢前辈们的探索,我看了他们的博文,让我少走了很多弯路. 前期准备: 1.微信认证服务号,并且开通了微信支付 2.微信支付SDK,下载地址:https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=11_1 3.登录微信支付平台https://pay.weixin.qq.com/index.php/account/api_cert下载支付证书

  • 网络安全渗透测试小程序抓包流程步骤详解

    目录 小程序测试流程 搜索目标小程序 小程序主体信息确认 小程序包获取 PC端 windows端获取小程序包流程 移动端 解包 调试 抓包 小程序测试流程 分为两个方面,解包可以挖掘信息泄露问题.隐藏的接口,抓包可以测试一些逻辑漏洞.API安全问题.两者结合起来就可以边调试边进行测试,更方便于安全测试. 搜索目标小程序 目标搜索不能仅仅局限于主体单位,支撑单位.供应商.全资子公司等都可能是入口点,所以小程序当然也不能放过它们. 小程序主体信息确认 查看小程序账号主体信息,否则打偏了花费了时间不说

  • python实现微信跳一跳辅助工具步骤详解

    说明 1.windows上安装安卓模拟器,安卓版本5.1以上 2.模拟器里下载安装最新的微信6.6.1 3.最好使用python2.7,python3的pyhook包有bug,解决比较麻烦 步骤 1.windows上安装python2.7,配置好环境变量和pip 2.到这个网站下载对应版本的pyHook和pywin32 http://www.lfd.uci.edu/~gohlke/pythonlibs 2.打开cmd,安装下载好的whl文件和其他库 pip install pywin32-221

  • 配置node服务器并且链接微信公众号接口配置步骤详解

    配置node服务器 在购买好服务器后,用Xshell链接到服务器. 1.安装nvm curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.34.0/install.sh | bash 或者 wget -qO- https://raw.githubusercontent.com/nvm-sh/nvm/v0.34.0/install.sh | bash 安装完,关闭重新启动一下Xshell. 2.用nvm安装node // 查看当前可安装n

  • Laravel 微信小程序后端搭建步骤详解

    1. 新建个 laravel 项目 laravel new aaaa 2. 执行命令运行起站点来 php artisan key:generate 3. 登录装着 mysql 服务的远程服务器,创建数据库及用户名 (1)登录 ssh root@218.45.23.456 (2)登录 mysql 输入命令 mysql -u root -p,输入密码登录成功显示 mysql> (3)创建数据库 create database aaaaaaaa charset utf8mb4; (4)创建远程用户 c

  • vue-cli安装使用流程步骤详解

    1.全局安装vue-cli cnpm i vue-cli -g 2.监测安装版本 vue -V 大写V : version 3.指定目录下新建项目 vue init webpack [项目名] 按自己的意愿配置.选择对应信息.最后配置完成检查package.json是否如此 4.进入到项目 cd demo 5.安装全部依赖(或者在init是选择自动安装) cnpm i 6.安装你需要但是默认没被安装的(比如axios) cnpm i --S vuex axios (上图忘了cd到对应目录,自己安

  • 微信小程序 支付功能实现PHP实例详解

    微信小程序 支付功能实现PHP实例详解 前端代码: wx.request({ url: 'https://www.yourhost.com/weixin/WeiActivity/payJoinfee',//改成你自己的链接 header: { 'Content-Type': 'application/x-www-form-urlencoded' }, method:'POST', success: function(res) { console.log(res.data); console.lo

  • django 微信网页授权认证api的步骤详解

    微信网页授权认证 根据微信官方文档,网页授权需要四个步骤, - 用户同意授权-获取code - 通过code 获取网页授权access_token - 通过code 获取网页授权access_token - 刷新token - 拉去用户信息scope为snsapi_userinfo -检验授权凭证 access_token是否有效 1 授权 url="https://open.weixin.qq.com/connect/oauth2/authorize?appid={0}&redirec

随机推荐