PHP如何封装微信支付摇摇乐免单SDK

最简单的ThinkPHP3.2.3封装微信支付V3接口
李清波个人博客网站,分享个人技术,分享个人心得。
最简单的ThinkPHP3.2.3封装微信支付V3接口
  微信支付现在分为v2版和v3版,号之前申请的为v2版,之后申请的为v3版。V3版的微信支付没有paySignKey参数。本教程是基于V3版本,下面开始教程;  首先是需要有已开通微信支付接口的认证服务号,这个相信大家都知道,开通之后微信会发一封邮件到你的邮箱,邮件的内容就是开发需要用到的一些接口信息了(包含账号密码之类的东西)。  一、参数配置  1、 设置JS接口安全域名,点击设置 -& 公众号设置 -& 功能设置 -& JS接口安全域名
-&设置,弹出JS安全域名输入框,建议域名写上带www和和不带www的,如下图    2、设置授权回调页面域名,点击开发者中心 -& 接口权限表 -& 网页服务 -&
获取用户基本信息-&修改(注意只有之前从未设置过时只有将鼠标放在获取用户基本信息上才会出现修改按钮),弹出授权回调页面域名:输入框,输入你的网站地址即可,如下图      3、设置微信安全支付目录,点击微信支付 -& 开发配置 -&
支付配置-&支付授权目录。正式目录和测试目录都可以写上,测试目录需要把个人微信号先添加到白名单才能使用。安全支付目录正确格式是
http://域名/分组/控制器/(仅对ThinkPHP),如下图    4、进入公众平台,点击开发者中心-&配置项-&开发者ID,记下APPID和APPSECRET,如下图    进入商家平台,点击账户设置-&账户信息-&基本账户信息,记录下微信支付商户号MCHID,如下图  点击账户信息-&API安全-&API密匙-&设置密匙,输入新的密匙KEY(注意一定要重置下密匙),并记录下密匙,如下图      二、引入微信支付SDK包  1、用TP的小伙伴们可以用下载的包,也可以自行到官网下载SDK包放到TP的扩展目录里,具体目录:ThinkPHP\Library\Vendor\;  2、打开包里的WxPayPubConfig.php文件,填写上你的微信支付的接口信息就好啦,(注意:微信支付是不需要证书的,只有退款和红包才会使用证书)如下图    三、下载整合文件  将下载的整合文件放入对应的目录,注意静态页面必须要引入jquery和weixin_pay.js,具体用法请参考demo文章来源“购过瘾”网,素质转载尊重原创者支付宝支付PHP SDK填坑集锦
我是最近才发现,支付宝支付SDK改版了,和去年相比已经有所不同。不过提供了老版本升级办法,还算人性化。
下面提供了我遇到的几个坑,并提供填坑办法。
1,找不到商户私钥,文档上写得不是很明白。
解决办法是:拿到对应算法的密钥生成工具,比如我用的RSA256,则使用secret_key_tools_RSA256_win这个工具。
点击“生成RSA密钥“,则会生成公钥。这时,当前文件夹下同时会生成rsa_private_key.pem文件,里面的内容即为商户私钥。
不过,这里有个坑!一定要注意!!!
正确操作是:
1》去掉第一行-----BEGIN RSA PRIVATE KEY-----
2》去掉最后一行-----END RSA PRIVATE KEY-----
3》去掉所有的换行符
这样就拿到真正的商户私钥了!
2,在linux 上运行报错:PHP Fatal error: Class 'LtObjectUtil' not found in。
这是因为人家用的lotusphp框架,和你正在使用的框架冲突了!比如yaf,swoole。
解决办法是:不用人家的框架,改为直接调用类。
require_once(WEBPATH.'/apps/classes/alipay/aop/request/AlipayTradePagePayRequest.php');
require_once(WEBPATH.'/apps/classes/alipay/aop/AopClient.php');
require_once(WEBPATH.'/apps/classes/alipay/pagepay/service/AlipayTradeService.php');
require_once(WEBPATH.'/apps/classes/alipay/pagepay/buildermodel/AlipayTradePagePayContentBuilder.php');
而且要在alipay/pagepay/service/AlipayTradeService.php里,注释掉第一行
//require_once dirname(dirname(dirname ( __FILE__ ))).'/AopSdk.php';
这样就可以了!
作者:熊跃辉
链接:http://www.jianshu.com/p/a51ed4142314
责任编辑:
声明:该文观点仅代表作者本人,搜狐号系信息发布平台,搜狐仅提供信息存储空间服务。
今日搜狐热点微信支付PHP SDK —— 公众号支付代码详解
转载 &更新时间:日 14:36:29 & 投稿:lqh
这篇文章主要介绍了微信支付PHP SDK 公众号支付代码详解方法的相关资料,需要的朋友可以参考下
在微信支付 开发者文档页面 下载最新的 php SDK
这里假设你已经申请完微信支付
1. 微信后台配置& 如图
我们先进行测试,所以先把测试授权目录和 测试白名单添加上。测试授权目录是你要发起微信请求的哪个文件所在的目录。
例如jsapi 发起请求一般是jsapi.php所在目录 为测试目录,测试白名单即开发人员的微信号。
正式的支付授权目录不能和测试的一样否则会报错。不填写或者填错授权目录以及测试白名单都会报错。
报错样例:
NaNsystem:access_denied
不在测试白名单
2. 配置 lib/WxPay.Config.php文件
最主要配置一下四项:
const APPID = '';
const MCHID = '';
const KEY = '';
const APPSECRET = '';
APPID 和 APPSECRET都可以在微信后台中找到。
MCHID 在申请微信支付后发来的邮件中可以找到,KEY 则根据邮件提示
去商户平台配置即可。
3. 访问起始 index.php
首先访问 index.php 你可以看到界面
我们首先需要的是 JSAPI支付。但是看代码 index.php 最下面的链接。他默认是个demo的链接,改为我们自定义的即可
&&& &li style="background-color:#FF7F24"&&a href="&?php echo 'http://'.$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'].'example/jsapi.php';?&"&JSAPI支付&/a&&/li&
&&& &li style="background-color:#698B22"&&a href="&?php echo 'http://'.$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'].'example/micropay.php';?&"&刷卡支付&/a&&/li&
&&& &li style="background-color:#8B6914"&&a href="&?php echo 'http://'.$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'].'example/native.php';?&"&扫码支付&/a&&/li&
&&& &li style="background-color:#CDCD00"&&a href="&?php echo 'http://'.$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'].'example/orderquery.php';?&"&订单查询&/a&&/li&
&&& &li style="background-color:#CD3278"&&a href="&?php echo 'http://'.$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'].'example/refund.php';?&"&订单退款&/a&&/li&
&&& &li style="background-color:#848484"&&a href="&?php echo 'http://'.$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'].'example/refundquery.php';?&"&退款查询&/a&&/li&
&&& &li style="background-color:#8EE5EE"&&a href="&?php echo 'http://'.$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'].'example/download.php';?&"&下载订单&/a&&/li&
当然你也可以直接写死为自己的访问链接。
4. JSAPI 支付
必要代码解析:
$logHandler= new CLogFileHandler("../logs/".date('Y-m-d').'.log');
$log = Log::Init($logHandler, 15);
调用日志类 可以通过 $log-&DEBUG(‘test‘); 打印调试信息。其实也可以直接使用 $Log::DEBUG(‘test‘); 来调试
$tools = new JsApiPay();
$openId = $tools-&GetOpenid();
主要是为了获取 openid 其中GetOpenid() 函数定义在 文件 WxPay.JsApiPay.php 文件中
public function GetOpenid()
//通过code获得openid
if (!isset($_GET['code'])){
//触发微信返回code码
$baseUrl = urlencode('http://'.$_SERVER['HTTP_HOST'].$_SERVER['PHP_SELF'].$_SERVER['QUERY_STRING']);
$url = $this-&__CreateOauthUrlForCode($baseUrl);
Header("Location: $url");
//获取code码,以获取openid
$code = $_GET['code'];
$openid = $this-&getOpenidFromMp($code);
$baseUrl 其实就是为了在跳转回来这个页面。& 可以继续跟踪函数__CreateOauthUrlForCode()& 其实就是通过微信的Auth2.0 来获取Openid
参考链接:
这就需要你把微信的 网页授权接口也设置好。
获取到 Openid 就可以调用微信支付的统一下单接口了。回到 文件 jsapi.php 如下代码
$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);
这里面的代码:
$input-&SetAttach("test");
如果 把值改为 $input-&SetAttach("test this is attach");就会存在bug 后面再说,其实这个参数不是必须的干脆可以去掉。
$input-&SetNotify_url("");
是设置接收支付结果通知的Url 这里是默认的demo 链接我们可以设置成我们的:
$input-&SetNotify_url(dirname('http://'.$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI']).'/notify.php');
当然你也可以选择直接写死。
其中的函数 unifiedOrder($input) 可以到WxPay.Api.php 中文件跟踪,其实就是调用统一下单接口。
在 WxPay.Api.php 中需要更改的一处代码是:
//异步通知url未设置,则使用配置文件中的url
if(!$inputObj-&IsNotify_urlSet()){
$inputObj-&SetNotify_url(WxPayConfig::NOTIFY_URL);//异步通知url
就是当没设置 notifyUrl 的时候回去配置文件中找,但是配置文件中根本没有设置。
所以你可以选择在 配置文件WxPay.Config.php 中加上这个配置,也可以直接写一个默认的notify链接。
函数 GetJsApiParameters() 是获取jsApi支付的参数给变量 $jsApiParameters 方便在下面的Js中调用
jsapi.php 中js的代码:
function jsApiCall()
WeixinJSBridge.invoke(
'getBrandWCPayRequest',
&?php echo $jsApiP ?&,
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);
jsApiCall();
其中点击立即支付按钮调用的就是 callpay() 函数,他有会调用jsApiCall() 函数打开支付程序。
此后输入密码完成支付。
在完成支付页面点击完成会回到这个支付页面,并弹出 支付成功的提示框
这个其实就是 js函数 jsApiCall 里面的alter 弹出的对话框
其中 res.err_msg 为get_brand_wcpay_request:ok 表明前端判断的支付成功,我们可以根据这个将支付跳转到成功页面。
但是这个并不可信。确认是否支付成功还是应当 通过notify.php 处理业务逻辑。
5. 支付结果通知 notify.php
其实这个页面最主要的代码就两行
$notify = new PayNotifyCallBack();
$notify-&Handle(false);
其中大部分逻辑在 Handle 函数中处理 文件 WxPay.Notify.php
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);
//该分支在成功回调到NotifyCallBack方法,处理完成之后流程
$this-&SetReturn_code("SUCCESS");
$this-&SetReturn_msg("OK");
$this-&ReplyNotify($needSign);
主要代码:
$result = WxpayApi::notify(array($this, 'NotifyCallBack'), $msg);
//跟踪函数 notify 文件WxPay.Api.php
public static function notify($callback, &$msg)
//获取通知的数据
$xml = $GLOBALS['HTTP_RAW_POST_DATA'];
//如果返回成功则验证签名
$result = WxPayResults::Init($xml);
} catch (WxPayException $e){
$msg = $e-&errorMessage();
return call_user_func($callback, $result);
通过 $GLOBALS[‘HTTP_RAW_POST_DATA‘]; 获取同志数据 然后 Init 函数验证签名等。验签成功运行代码
return call_user_func($callback, $result);
即调用了一个回调函数,NotifyCallBack() 函数并传递参数 $result 在NotifyCallBack函数中会调用我们重写的NotifyProcess()函数(此函数在notify.php 中被重写)
NotifyProcess() 判断也没有问题就会 设置返回 success的xml信息
$this-&SetReturn_code("SUCCESS");
$this-&SetReturn_msg("OK");
并最终调用函数 $this-&ReplyNotify($needSign);& echo success的结果
函数ReplyNotify 需要修改一处代码:
final private function ReplyNotify($needSign = true)
//如果需要签名
if($needSign == true &&
$this-&GetReturn_code($return_code) == "SUCCESS")
$this-&SetSign();
WxpayApi::replyNotify($this-&ToXml());
$this-&GetReturn_code($return_code) == "SUCCESS")
$this-&GetReturn_code() == "SUCCESS")
这样整个流程就结束了。上面提到了 传递订单参数
$input-&SetAttach("test");
如果我设置 值为 test this is attach (其实只要有空格就会存在bug)
如图 传递的订单信息
可以看到 attach 信息正常,当然支付也是正常的没有任何问题。
但是发现总是会收到notify 通知,即意味着没有返回给微信服务器正确的结果通知。
打印服务器发来的通知数据
可以看到 attach 是 test+this+is+attach 即空格被转化为加号
打印接收到的签名和程序算出来的签名发现 签名不同,即认为接收结果异常。
所以我们要是想使用attach 这个值就不能有空格,要么干脆不使用这个参数
(等待微信修复这个bug, 也可能是我这边有哪个地方不会? - -#)
这样 微信支付的 JsApi支付就大致分析完成了。
以上就是对微信支付PHP SDK 支付代码的详解,后续继续补充相关资料,谢谢大家对本站的支持!
您可能感兴趣的文章:
大家感兴趣的内容
12345678910
最近更新的内容
常用在线小工具&nbsp>&nbsp
&nbsp>&nbsp
&nbsp>&nbsp
thinkphp框架中引入ping++支付server SDK
摘要:ping++支付平台整合了支付宝,微信支付,百度钱包,银联支付等主流支付方式。而且其开发文档,也很容易理解和上手,所以想写篇博客,记录下来(thinkphp)服务器端使用其SDK的步骤【test模式下】。开始之前最好先看一看官方文档对于支付过程的解释:第一步:去www.pingxx.com新注册一个账号。注册完成进入个人中心后,你将会得到一些参数:①TestSecretKey:(该参数在server端配置,用于和客户端的TestPublishableKey配合使用)②ping
ping++支付平台整合了支付宝,微信支付,百度钱包,银联支付等主流支付方式。而且其开发文档,也很容易理解和上手,所以想写篇博客,记录下来(thinkphp)服务器端使用其SDK的步骤【test模式下】。开始之前 最好先看一看官方文档对于支付过程的解释:
第一步:去www.pingxx.com新注册一个账号。注册完成进入个人中心后,你将会得到一些参数:
①Test Secret Key:(该参数在server端配置,用于和客户端的Test Publishable Key配合使用)
②ping++公钥:
(支付完成后,平台往server端返回webhooks,此参数用于验证交易安全性)
③Test Publishable Key:(该参数用于客户端,与上面server端的的Test Serect Key配合使用)
④商户公钥:
(用于server端和平台交易时,RSA签名的验证),至于如何产生商户公钥对,根据图中蓝色字的引导,很容易就完成了,此处不再赘述。产生了公钥对之后,把公钥填写在下图中的textarea中,私钥留着先,后面有用。
第二步:下载官方的server端SDK。
PHP的下载链接是https://github.com/PingPlusPlus/pingpp-php
下载好了之后,加压出来,放在thinkphp第三方库扩展目录里面:
如左图所示,lib文件夹,init.php,还有第一步④产生的公钥对中的
私钥放进去。至于data文件夹里的文件,是使用HTTPS时用的安全证书,暂时也拿过来。 第三步:在代码中使用上面的参数,看看引入是否成功publicfunctionindex(){$api_key='请填写自己的TestSerectKey';//API-KEY,注册ping++时自动生成
$app_id='请填写自己的APP的ID';//APP_ID,注册时自动生成Vendor('pingpp.init');//引入类库初始化文件//以支付宝,支付10块钱。注意amount为1000,单位是”分钱“
$input_data=array('channel'=&'alipay','amount'=&1000);//$input_data应该是你从APP客户端收到的json数据(根据业务可以在服务器端定义),需json_decode
if(empty($input_data['channel'])||empty($input_data['amount'])){
echo'channeloramountisempty';//检验支付参数
}$channel=strtolower($input_data['channel']);//支付渠道:支付宝
$amount=$input_data['amount'];//支付金额10块钱
$orderNo=substr(md5(time()),0,12);//订单号,必须唯一。根据支付渠道不同,长度要求也不一样,请查看文档https://www.pingxx.com/api#api-c-new/Pingpp/Pingpp::setPrivateKeyPath(VENDOR_PATH.'/pingpp/rsa_private_key.pem');//引入你的签名私钥//$extra用于设置支付渠道所需的额外参数,额外参数多数是可选,请根据需求来决定。详情看参考文档
//$extra=array(
//'success_url'=&'http://example.com/success',
//'cancel_url'=&'http://example.com/cancel'
//);/Pingpp/Pingpp::setApiKey($api_key);//设置API-KEYtry{
$ch=/Pingpp/Charge::create(//create方法表示发送支付请求到ping++平台,$ch表示请求成功时返回的charge对象(json格式),服务器端如果发起请求成功,此时只需要把charge对象传递给APP客户端,交给客户端处理
'subject'=&'YourSubject',//关于这些参数的意义,请参考文档https://www.pingxx.com/api#api-c-new
'body'=&'YourBody',
'amount'=&$amount,
'order_no'=&$orderNo,
'currency'=&'cny',
//'extra'=&$extra,
'channel'=&$channel,
'client_ip'=&$_SERVER['REMOTE_ADDR'],
'app'=&array('id'=&$app_id)
}catch(/Pingpp/Error/Base$e){//如果发起支付请求失败,则抛出异常
//捕获报错信息
if($e-&getHttpStatus()!=NULL){
header('Status:'.$e-&getHttpStatus());
echo$e-&getHttpBody();
echo$e-&getMessage();
}//代码到此处,如果你向ping++平台请求支付成功,并且把charge对象传递给了客户端,那么接下来客户端如果成功完成了支付,那么
//平台将会请求你填写的Webhooks回调url,在该url里,接收Webhooks通知,根据数据的结果做出逻辑判断:如果支付成功....,如果支付失败..
如果此时,能在浏览器返回一串json数据,那么你的初步调试就通过.
第四步:填写你的webhook的回调地址。如果客户端发起的支付,已经完成交易,那么交易成功的json消息,会返回到该回调地址,你根据json消息,对自己的数据库和业务作出相应的回应或者抛出支付错误信息。webhook的填写,请到个人中心去填写
以上是的内容,更多
的内容,请您使用右上方搜索功能获取相关信息。
若你要投稿、删除文章请联系邮箱:zixun-group@service.aliyun.com,工作人员会在五个工作日内给你回复。
云服务器 ECS
可弹性伸缩、安全稳定、简单易用
&40.8元/月起
预测未发生的攻击
&24元/月起
邮箱低至5折
推荐购买再奖现金,最高25%
&200元/3月起
你可能还喜欢
你可能感兴趣
阿里云教程中心为您免费提供
thinkphp框架中引入ping++支付server SDK相关信息,包括
的信息,所有thinkphp框架中引入ping++支付server SDK相关内容均不代表阿里云的意见!投稿删除文章请联系邮箱:zixun-group@service.aliyun.com,工作人员会在五个工作日内答复
售前咨询热线
支持与服务
资源和社区
关注阿里云
International

我要回帖

更多关于 微信扫商家二维码支付 的文章

 

随机推荐