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

前期准备:

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

方法步骤:

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 '统一下单支付单信息
';

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. 支付验证链接

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

E. 附加参数

$input->SetAttach("test");

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

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

(3)发起支付

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

}

}

点击立即支付按钮调用的就是 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支付)流程步骤详解,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对脚本之家网站的支持!

jsapi支付签名_PHP实现微信支付(jsapi支付)流程步骤详解相关推荐

  1. python跳一跳编程构造_python实现微信跳一跳辅助工具步骤详解

    说明 1.windows上安装安卓模拟器,安卓版本5.1以上 2.模拟器里下载安装最新的微信6.6.1 3.最好使用python2.7,python3的pyhook包有bug,解决比较麻烦 步骤 1. ...

  2. 微信公众平台菜单编辑php,Vue.js实现微信公众号菜单编辑器步骤详解(上)

    这次给大家带来Vue.js实现微信公众号菜单编辑器步骤详解(上),Vue.js实现微信公众号菜单编辑器的注意事项有哪些,下面就是实战案例,一起来看一下. 学习一段时间Vue.js,于是想尝试着做一个像 ...

  3. python hook pc微信_python实现微信跳一跳辅助工具步骤详解

    说明 1.windows上安装安卓模拟器,安卓版本5.1以上 2.模拟器里下载安装最新的微信6.6.1 3.最好使用python2.7,python3的pyhook包有bug,解决比较麻烦 步骤 1. ...

  4. python实现微信hook_python实现微信跳一跳辅助工具步骤详解

    说明 1.windows上安装安卓模拟器,安卓版本5.1以上 2.模拟器里下载安装最新的微信6.6.1 3.最好使用python2.7,python3的pyhook包有bug,解决比较麻烦 步骤 1. ...

  5. python hook 微信_python实现微信跳一跳辅助工具步骤详解

    说明 1.windows上安装安卓模拟器,安卓版本5.1以上 2.模拟器里下载安装最新的微信6.6.1 3.最好使用python2.7,python3的pyhook包有bug,解决比较麻烦 步骤 1. ...

  6. 新手微信小程序制作教程步骤详解!

    制作微信小程序方法: 1.在微信公众平台上申请一个小程序账号,申请完成之后需要进行微信认证,并且需要缴纳300元的认证费用.如果不缴纳300元的费用,微信小程序商城没有开通支付功能. 2.新建一个空白 ...

  7. 微信支付【H5非微信内浏览器支付】

    最近需要在电商平台集成微信支付,PC端扫码支付,移动端是H5支付,扫码支付,这个比较简单,主要是H5支付,要求非微信内浏览器支付.看了官方文档发现,没有这种模式,只有扫码支付.刷卡支付.APP支付.公 ...

  8. java微信无感支付怎么开通_微信无感支付在哪?怎么使用微信无感支付

    不久前微信启动了高速无感支付,也就是说无需手机,即可付款,不知道大家有没有使用过?其实这一功能已经在山东等多个城市成功试点,现在已经在全国大多数城市覆盖. 那么微信高速无感支付要如何使用呢? 开通微信 ...

  9. java微信无感支付怎么开通_微信无感支付怎么设置?方法介绍

    随着微信支付在我们日常生活中的不断普及,微信更是不负众望,相继推出了很多新功能,这段时间,微信无感支付让很多用户交口称赞,无数的车主朋友都微信无感支付体验到了快速支付通行费的方便.那么,你知道微信无感 ...

最新文章

  1. shell date 获取昨天日期
  2. 怎么求人眼图像中的噪声
  3. 在 Linux 中如何禁止用户登录
  4. 高并发服务端分布式系统设计概要(上)
  5. 9.使用原生js实现类似于jquery的动画
  6. 2017蓝桥杯省赛---java---B---2(纸牌三角形)
  7. JAVA知识基础(二):基本语法
  8. Visual Studio .NET已检测到指定的Web服务器运行的不是ASP.NET 1.1 版...的解决办法
  9. typescript 判断异步执行已经结束_vue进阶系列——用typescript玩转vue和vuex
  10. 哈哈哈,第一次做codeforce
  11. shiro权限架作战
  12. tif(tiff)图片格式批量转换JPG图片格式转换器
  13. RabbitMQ使用教程(超详细)
  14. arm linux vi键盘错乱,Ubuntu Server 18.04安装后vi命令解决键盘错乱方法和wifi连接之后不能上网...
  15. 微信小程序等第三方应用接入易班的api
  16. 平板电脑安装软件_哪个便签可以横屏?平板电脑横屏便签软件推荐
  17. Java流程控制练习题
  18. 操作系统(Linux)
  19. 计算机右键菜单更换顺序,笔记本电脑怎么样调整右键选项顺序
  20. 基础不牢靠,何以争朝夕?Java基础面试82道详细解析(更新中)

热门文章

  1. 【建议收藏】二叉树的序列化与反序列化
  2. HTML、CSS、javascript总结
  3. java8 lambda判断_Java8新特性-Lambda表达式
  4. idea2021如何开启RunDashboard
  5. java面试开发过程中用到的问题
  6. Nauuo and Votes
  7. 【转载】一文彻底拿下Java异常
  8. swagger2的使用和swagger2markup离线文档的生成(最简单的方式)
  9. spring的aware学习
  10. PHP简单实现LRU算法原理