A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© huawei 黑马粉丝团   /  2017-1-18 15:57  /  16447 人查看  /  118 人回复  /   5 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 huawei 于 2017-3-5 10:28 编辑

《PHP微信接口开发》 在PHP学习路线图是一个热门分享资源。很多人看完该视频后,获益匪浅,但是也发现有一个小小的遗憾,这么好的视频竟然没有讲到微信支付功能。所以应广大自学党的要求,现在特分享PHP微信支付源码给大家以参考!

----------------------------------下面开启干货分享---------------------------------------

1.开发环境
Thinkphp 3.2.3
微信:服务号,已认证
开发域名:http://test.paywechat.com (自定义的域名,外网不可访问,如果不懂怎么设置,就查看这个帖:http://bbs.itheima.com/thread-300392-1-1.html)

2.需要相关文件和权限
微信支付需申请开通
微信公众平台开发者文档:http://mp.weixin.qq.com/wiki/home/index.html
微信支付开发者文档:https://pay.weixin.qq.com/wiki/doc/api/index.html
微信支付SDK下载地址:https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=11_1

3.开发
下载好微信支付PHP版本的SDK,文件目录为下图:
1.png
2.png
把微信支付SDK的Cert和Lib目录放入Thinkphp,目录为
3.png

现在介绍微信支付授权目录问题,首先是微信支付开发配置里面的支付授权目录填写,
5.png

然后填写JS接口安全域。
6.png

最后设置网页授权
7.png
这些设置完,基本完成一半,注意设置的目录和我thinkphp里面的目录。
8.png
4.微信支付配置
9.png

5、准备下面几个PHP脚本

1)在Wxpay.config.php脚本中,把相关配置填写正确,如下所示:

<?php
/**
* 配置账号信息
*/
class WxPayConfig
{
//=======【基本信息设置】=====================================
//
/**
* TODO: 修改这里配置为您自己申请的商户信息
* 微信公众号信息配置
*
* APPID:绑定支付的APPID(必须配置,开户邮件中可查看)
*
* MCHID:商户号(必须配置,开户邮件中可查看)
*
* KEY:商户支付密钥,参考开户邮件设置(必须配置,登录商户平台自行设置)
* 设置地址:https://pay.weixin.qq.com/index.php/account/api_cert
*
* APPSECRET:公众帐号secert(仅JSAPI支付的时候需要配置, 登录公众平台,进入开发者中心可设置),
* 获取地址:https://mp.weixin.qq.com/advance ... 05451881&lang=zh_CN
* @var string
*/
const APPID = '';
const MCHID = '';
const KEY = '';
const APPSECRET = '';

//=======【证书路径设置】=====================================
/**
* TODO:设置商户证书路径
* 证书路径,注意应该填写绝对路径(仅退款、撤销订单时需要,可登录商户平台下载,
* API证书下载地址:https://pay.weixin.qq.com/index.php/account/api_cert,下载之前需要安装商户操作证书)
* @var path
*/
const SSLCERT_PATH = '../cert/apiclient_cert.pem';
const SSLKEY_PATH = '../cert/apiclient_key.pem';

//=======【curl代理设置】===================================
/**
* TODO:这里设置代理机器,只有需要代理的时候才设置,不需要代理,请设置为0.0.0.0和0
* 本例程通过curl使用HTTP POST方法,此处可修改代理服务器,
* 默认CURL_PROXY_HOST=0.0.0.0和CURL_PROXY_PORT=0,此时不开启代理(如有需要才设置)
* @var unknown_type
*/
const CURL_PROXY_HOST = "0.0.0.0";//"10.152.18.220";
const CURL_PROXY_PORT = 0;//8080;

//=======【上报信息配置】===================================
/**
* TODO:接口调用上报等级,默认紧错误上报(注意:上报超时间为【1s】,上报无论成败【永不抛出异常】,
* 不会影响接口调用流程),开启上报之后,方便微信监控请求调用的质量,建议至少
* 开启错误上报。
* 上报等级,0.关闭上报; 1.仅错误出错上报; 2.全量上报
* @var int
*/
const REPORT_LEVENL = 1;
}
[/hide]

2)敲出微信支付父类控制器代码:

游客,如果您要查看本帖隐藏内容请回复


3、敲出微信支付测试控制器代码

游客,如果您要查看本帖隐藏内容请回复


4)贴上模板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',
{$jsApiParameters},
function(res){
WeixinJSBridge.log(res.err_msg);
//取消支付
if(res.err_msg == 'get_brand_wcpay_request:cancel'){
//处理取消支付的事件逻辑
}else if(res.err_msg == "get_brand_wcpay_request:ok"){
/*使用以上方式判断前端返回,微信团队郑重提示:
res.err_msg将在用户支付成功后返回 ok,但并不保证它绝对可靠。
这里可以使用Ajax提交到后台,处理一些日志,如Test控制器里面的ajax_PaySuccess方法。
*/
}
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',
{$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;background-color:#FE6714; border:0px #FE6714 solid; cursor: pointer; color:white; font-size:16px;" type="button" >立即支付</button>
</div>
</body>
</html>

5)notify.php文件代码,这里有在官方文件里新添加的一个自定义方法。

[hide]
<?php
require_once ROOT_PATH."Api/lib/WxPay.Api.php";
require_once ROOT_PATH.'Api/lib/WxPay.Notify.php';
require_once ROOT_PATH.'Api/lib/log.php';

//初始化日志
$logHandler= new \CLogFileHandler(ROOT_PATH."/logs/".date('Y-m-d').'.log');
$log = \Log::Init($logHandler, 15);

class PayNotifyCallBack extends WxPayNotify
{
protected $para = array('code'=>0,'data'=>'');
//查询订单
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")
{
return true;
}
$this->para['code'] = 0;
$this->para['data'] = '';
return false;
}

//重写回调处理函数
public function NotifyProcess($data, &$msg)
{
\Log::DEBUG("call back:" . json_encode($data));
$notfiyOutput = array();

if(!array_key_exists("transaction_id", $data)){
$msg = "输入参数不正确";
$this->para['code'] = 0;
$this->para['data'] = '';
return false;
}
//查询订单,判断订单真实性
if(!$this->Queryorder($data["transaction_id"])){
$msg = "订单查询失败";
$this->para['code'] = 0;
$this->para['data'] = '';
return false;
}

$this->para['code'] = 1;
$this->para['data'] = $data;
return true;
}

/**
* 自定义方法 检测微信端是否回调成功方法
* @return multitype:number string
*/
public function IsSuccess(){
return $this->para;
}
}


到这里基本上完成,可以在微信端打开http://域名/Charge/index.php/Test/index/

118 个回复

倒序浏览
回复 使用道具 举报
不懂PHP微信
回复 使用道具 举报
经典课程,必须回复
回复 使用道具 举报
我要看,我要学,我要学会
回复 使用道具 举报
陈伟为 来自手机 初级黑马 2017-1-19 11:38:33
地板
你好,谢谢谢谢谢谢谢谢谢谢谢谢哥谢谢谢谢谢谢谢谢谢谢
回复 使用道具 举报
陈伟为 来自手机 初级黑马 2017-1-19 11:39:09
7#
你好,谢谢谢谢谢谢谢谢谢谢谢谢哥谢谢谢谢谢谢谢谢谢谢
回复 使用道具 举报
陈伟为 来自手机 初级黑马 2017-1-19 11:39:41
8#
你好,谢谢谢谢谢谢谢谢谢谢谢谢哥谢谢谢谢谢谢谢谢谢谢
回复 使用道具 举报
陈伟为 来自手机 初级黑马 2017-1-19 11:40:12
9#
你好,谢谢谢谢谢谢谢谢谢谢谢谢哥谢谢谢谢谢谢谢谢谢谢
回复 使用道具 举报
陈伟为 来自手机 初级黑马 2017-1-19 11:40:56
10#
你好,谢谢谢谢谢谢谢谢谢谢谢谢哥谢谢谢谢谢谢谢谢谢谢
回复 使用道具 举报
感谢分享,呵呵
回复 使用道具 举报
感谢分享,感谢分享,感谢分享
回复 使用道具 举报
想看,想学
回复 使用道具 举报
微信开发
回复 使用道具 举报
学习中.........
回复 使用道具 举报
11111111111111
回复 使用道具 举报
看看看看
回复 使用道具 举报
多积累下,说不定就用到了呢
回复 使用道具 举报
经典课程,必须回复
回复 使用道具 举报
看看,顺便学习学习
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马