PHP后台微信支付使用方法
主要为大家详细介绍了PHP后台微信支付和支付宝支付开发的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下.
微信支付
项目前提:本人用的是tp框架,PHP语言
下载到微信平台提供的微信支付接口文件,放在了tp第三方类库vendor,命名为WxpayAPI
WxpayAPI/lib/WxPay.Api.php 接口访问类;
WxpayAPI/lib/WxPay.Config.php 配置账号信息;
WxpayAPI/lib/WxPay.Data.php 数据对象基础类;
WxpayAPI/lib/WxPay.Exception.php 微信支付API异常类;
WxpayAPI/lib/WxPay.Notify.php 回调基础类
WxpayAPI/example/WxPay.JsApiPay.php JSAPI支付实现类
1.对源码进行了部分修改
(1)WxPay.Api.php 里注释掉
/pic/p>
/pic/p>
/pic/p>
(2)WxPay.Config.php里
需要根据商户信息对APPID , MCHID ,KEY , APPSECRET 进行配置。
(3)WxPay.Data.php 里注释掉
/pic/p>
/pic/p>
(4)WxPay.JsApiPay.php 里注释掉
/pic/lib/WxPay.Api.php";
配置好这些,接下来就是我们的重点部分了。
2.在订单控制器GoodsController.class.php有订单函数sure()和回调信息函数 Callback_url()
/**
* 提交订单函数
*/
public function sure() {
$o_model = D("Wine/Orders");
if (IS_AJAX) {
$data = I("post.");
if ($o_model->create($data)) {
if (!sp_check_verify_code()) {
$this->error("验证码错误!");
}
#生成随机订单号
$order_code = 'O' . date('YmdHis') . $o_model->get_order_code(4);
while ($o_model->findone(array("order_code" => $order_code))) {
$order_code = 'O' . date('YmdHis') . $o_model->get_order_code(4);
}
$data['order_code'] = $order_code;
$addr[0] = $_POST['prov'];
$addr[1] = $_POST['city'];
$addr[2] = $_POST['dist'];
$addr[3] = $_POST['area'];
$data['area'] = serialize($addr);
$data['create_time'] = time();
$data['update_time'] = time();
if ($data['pay_id'] == 1) {
$data['order_status'] = 11; /pic/p>
$data['status'] = '1';
} else {
$data['order_status'] = 10; /pic/p>
$data['status'] = '1';
}
/pic/p>
$this->Callback_url($data);
} else {
$this->error($o_model->getError());
}
} else {
$this->error($o_model->getError());
}
}
/**
* 回调信息函数
* @param type $data
*/
public function Callback_url($data) {
$o_model = D("Wine/Orders");
$add_id = $o_model->add($data);
if (!$add_id) {
$this->error("订单提交失败,请稍后重试!");
}
if ('4' == $data['pay_id']) {
if ('4' == $data['pay_id']) {
/pic/p>
$msg = '正在为您跳转到微信支付页面,请等待……';
$url = "/index.php/wine/wxpay/index/?o_id=$add_id";
}
$this->success("订单提交成功!" . $msg, $url);
}
3.[重点!!!] WxpayController .class.php微信支付控制器,实现对微信接口的调用
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
<?php
/**
* 微信支付接口调用
*/
namespace Wine\Controller;
use Common\Controller\HomebaseController;
class WxpayController extends HomebaseController {
public function _initialize() {
parent::_initialize();
Vendor("WxpayAPI/example/log");/pic/p>
/pic/p>
Vendor("WxpayAPI/example/WxPay#JsApiPay");
Vendor("WxpayAPI/lib/WxPay#Config");
Vendor("WxpayAPI/lib/WxPay#Data");
Vendor("WxpayAPI/lib/WxPay#Exception");
Vendor("WxpayAPI/lib/WxPay#Notify");
Vendor("WxpayAPI/lib/WxPay#Api");
/pic/p>
$logHandler = new \CLogFileHandler("/projects/wine.huishuocs.com/data/pay_log/" . date('Y-m-d') . '.log');
$log = \Log::Init($logHandler, 15);
$this->model = D("Wine/Orders");
$this->url = MODULE_NAME . '/' . CONTROLLER_NAME . '/index';
}
/**
* 显示支付页面
*
*/
public function index() {
/pic/p>
$orderid = I("get.o_id", 0, "intval");
$orderid || $this->error("非法操作!");
$this->assign('orderid',$orderid);
$info = $this->model->findone(array("a.id" => $orderid, 'a.status' => array('neq', '-1')));
$info || $this->error("暂未查询到该订单!");
/pic/p>
if ($info['order_status'] != 10) {
$this->error("订单已支付!");
}
/pic/p>
$tools = new \JsApiPay();
$openId = $tools->GetOpenid(); #无法使用
/pic/p>
\Log::INFO('订单' . var_export($info, true));
$out_trade_no = \WxPayConfig::MCHID . date("YmdHis");
$this->model->where(array("id" => $orderid))->save(array('out_trade_no' => $out_trade_no));
/pic/p>
/pic/p>
$input = new \WxPayUnifiedOrder();
$input->SetBody($info['mode_name']);
$input->SetAttach($orderid);
$input->SetOut_trade_no($out_trade_no);
/pic/p>
$input->SetTotal_fee($info['pay_price']*100); /pic/p>
$this->assign('pay_price',$info['pay_price']);
$input->SetTime_start(date("YmdHis"));
$input->SetTime_expire(date("YmdHis", time() + 600));
/pic/p>
$input->SetNotify_url('/pic/index.php/Wine/Wxpay/callback"); /pic/p>
$input->SetTrade_type("JSAPI");
$input->SetOpenid($openId);
$order = \WxPayApi::unifiedOrder($input);
/pic/b></font><br/>';
/pic/pic/p>
$this->assign('o_id',$orderid);
$this->assign('jsApiParameters', $tools->GetJsApiParameters($order));
/pic/p>
/pic/p>
$this->display('wxpay');
exit;
}
/**
* 打印输出数组信息
* @param type $data
*/
public function printf_info($data) {
foreach ($data as $key => $value) {
echo "<font color='#00ff55;'>$key</font> : $value <br/>";
}
}
/* 支付成功回调函数 */
public function callback() {
/* 返回给微信服务器 */
/pic/p>
/pic/p>
/pic/p>
/pic/p>
/pic/p>
$logHandler = new \CLogFileHandler("/projects/wine.huishuocs.com/data/pay_log/" . date('Y-m-d') . '.log');
$log = \Log::Init($logHandler, 15);
/pic/p>
$streamData = file_get_contents('php:/pic/p>
if ($streamData != '') {
$arr = $this->xmlToArray($streamData);
\Log::INFO('支付' . var_export($arr, true));
} else {
$ret = false;
}
/pic/p>
if (!empty($arr)) {
# 数据
\Log::INFO('数据1' . var_export($arr, true));
#修改订单状态
$out_trade_no = $arr['out_trade_no'];
$newArr = array('order_status' => 11,'status'=>1);
$this->model->where(array("out_trade_no" => $out_trade_no))->save($newArr);
$info = $this->model->findone(array("a.out_trade_no" => $out_trade_no, 'a.status' => array('neq', '-1')));
$sql = $this->model->getLastSql();
\Log::INFO('数据2' . $sql);
#添加支付记录pay
$pay = array(
'payment_code' => 'wxpay',
'trade_no'=>$info['order_code'],
'out_trade_no'=>$out_trade_no,
'order_id'=>$info['id'],
'create_time'=>time()
);
M('payment_record')->add($pay);
}
/* 返回给微信服务器 */
$mes = array(
'return_code' => 'SUCCESS',
'return_msg' => 'OK'
);
$this->ajaxReturn($mes, 'XML');
}
/pic/p>
public function xmlToArray($xml) {
/pic/p>
libxml_disable_entity_loader(true);
$values = json_decode(json_encode(simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOCDATA)), true);
return $values;
}
}
?>
4.前端微信支付页面wxpay.html
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
<html>
<head>
<meta http-equiv="content-type" content="text/html;charset=utf-8"/>
<meta name="viewport" content="width=device-width, initial-scale=1"/>
<link href="__TMPL__Public/css/weui.css" rel="external nofollow" type="text/css" rel="stylesheet"/>
<title>微信订单支付</title>
<script type="text/javascript">
/pic/p>
function jsApiCall()
{
WeixinJSBridge.invoke(
'getBrandWCPayRequest',
<php> echo $jsApiParameters; </php>,
function(res) {
WeixinJSBridge.log(res.err_msg);
if (res.err_msg == "get_brand_wcpay_request:ok") {
/pic/p>
/pic/p>
window.location.href = '{:U("Orders/pay_ok",array("o_id"=>$o_id))}';
} else {
/pic/p>
}
}
);
}
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>
</head>
<body>
<br/>
<p class="container" id="container"><p class="msg">
<p class="weui_msg">
<p class="weui_icon_area"><i class="weui_icon_success weui_icon_msg"></i></p>
<p class="weui_text_area">
<h2 class="weui_msg_title">订单已生成</h2>
<p class="weui_msg_desc">该笔订单支付金额为:<php> echo $pay_price;</php></p>
</p>
<p class="weui_opr_area">
<p class="weui_btn_area">
<a href="javascript:;" rel="external nofollow" class="weui_btn weui_btn_primary" onclick="callpay()">立即支付</a>
<!--<a href="{:U('Order/pay_ok',array('o_id'=>$_GET['o_id']))}" rel="external nofollow" class="weui_btn weui_btn_default">取消支付</a>-->
</p>
</p>
<!-- <p class="weui_extra_area">
<a href="/wap/order/order_det/<?php echo $order['id']?>.html" rel="external nofollow" >查看详情</a>
</p>-->
</p>
</p>
</p>
</body>
</html>
5.支付成功跳转到OrderController.class.php ,订单支付完成
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
/**
* 支付页面
*/
public function pay_ok() {
$o_id = I("get.o_id", 0, "intval");
$info = $this->model->findone(array("a.id" => $o_id, 'a.status' => array('neq', '-1')));
if (empty($info)) {
# 获取最新可用的商品编号
$goods = D('Goods')->where(array('status' => '1'))->order('id desc')->find();
$this->error("该订单不存在,请重新正确进入", U('Goods/sale', array('id' => $goods['id'])));
}
$this->assign('imgurl', "/wine/img/ok.png");
$this->assign('tips', "订购成功");
if ('4' == $info['pay_id']) {
/pic/p>
$this->assign($info);
$this->display();
} else {
$this->assign($info);
$this->assign('tips', "订购失败");
$this->assign('imgurl', "/wine/img/nook.png");
$this->display();
}
}
【PHP后台微信支付使用方法】相关文章:
PHP开发微信支付实例代码12-19
php微信支付之APP支付方法10-09
PHP中trait的使用方法12-26
php中cookie的使用方法11-05
PHP autoload函数的使用方法01-02
PHP微信jssdk配置12-22
PHP如何开发paypal支付插件03-09
PHP中魔术方法的使用方法12-03
PHP中trait使用方法介绍03-04