The two most popular payment platforms at the moment, WeChat Pay and Alipay Payment, make payments very conveniently through mobile phone QR codes in streets, alleys, shopping malls, supermarkets, convenience stores, etc., reducing the use of cash.
Next, our PHP Chinese website will take PHP beginners to understand how to implement WeChat payment and Alipay payment.
The first thing you need is to have a certain grasp and understanding of PHP knowledge. You can learn through tutorials:
Related links: http ://m.sbmmt.com/course/379.html
You can also learn the popular tp5 framework course in China first:
Related links: //m.sbmmt.com/course/486.html
WeChat payment
Project premise: use It is a tp framework, PHP language
Download the WeChat payment interface file provided by the WeChat platform, put it in the tp third-party class library vendor, and name it 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. The source code has been partially modified
(1) WxPay.Api. Comment out
in php //require_once"WxPay.Exception.php";
//require_once "WxPay.Config.php";
//require_once "WxPay.Data.php ";
(2) In WxPay.Config.php
it is necessary to configure APPID, MCHID, KEY and APPSECRET according to the merchant information.
(3) Comment out
in WxPay.Data.php //require_once "WxPay.Config.php";
//require_once "WxPay.Exception.php";
(4) Comment out
in WxPay.JsApiPay.php //require_once "../lib/WxPay.Api.php";
Configure these. Next is our focus.
2. In the order controller GoodsController.class.php, there are the order function sure() and the callback information function 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; //已付款 $data['status'] = '1'; } else { $data['order_status'] = 10; //待付款 $data['status'] = '1'; } //函数调用 返回信息 $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']) { //微信支付 $msg = '正在为您跳转到微信支付页面,请等待……'; $url = "/index.php/wine/wxpay/index/?o_id=$add_id"; } $this->success("订单提交成功!" . $msg, $url); }
3.[Emphasis! ! ! ]WxpayController .class.php WeChat payment controller implements the call to the WeChat interface
model = D("Wine/Orders"); $this->url = MODULE_NAME . '/' . CONTROLLER_NAME . '/index'; } /** * 显示支付页面 * */ public function index() { // 判断当前订单是否被支付 $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("暂未查询到该订单!"); //10代表订单待支付的状态 if ($info['order_status'] != 10) { $this->error("订单已支付!"); } //①、获取用户openid $tools = new \JsApiPay(); $openId = $tools->GetOpenid(); #无法使用 //初始化日志 \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)); // $openId ="123"; #无法使用 //②、统一下单 $input = new \WxPayUnifiedOrder(); $input->SetBody($info['mode_name']); $input->SetAttach($orderid); $input->SetOut_trade_no($out_trade_no); // $input->SetTotal_fee($orderArr['total_price']*100);实际支付价格 $input->SetTotal_fee($info['pay_price']*100); //测试时请将支付价格改为0.01,土豪请避开此注释 $this->assign('pay_price',$info['pay_price']); $input->SetTime_start(date("YmdHis")); $input->SetTime_expire(date("YmdHis", time() + 600)); // $input->SetGoods_tag("test");# 优惠券 $input->SetNotify_url('http://' . $_SERVER['HTTP_HOST'] . "/index.php/Wine/Wxpay/callback"); //回调地址 $input->SetTrade_type("JSAPI"); $input->SetOpenid($openId); $order = \WxPayApi::unifiedOrder($input); // echo '统一下单支付单信息
'; // $this->printf_info($order);//打印参数 $this->assign('o_id',$orderid); $this->assign('jsApiParameters', $tools->GetJsApiParameters($order)); //获取共享收货地址js函数参数 // $this->assign('editAddress', $tools->GetEditAddressParameters()); $this->display('wxpay'); exit; } /** * 打印输出数组信息 * @param type $data */ public function printf_info($data) { foreach ($data as $key => $value) { echo "$key : $value
"; } } /* 支付成功回调函数 */ public function callback() { /* 返回给微信服务器 */ // $mes = array( // 'return_code' => 'SUCCESS', // 'return_msg' => 'OK' // ); // $this->ajaxReturn($mes, 'XML'); $logHandler = new \CLogFileHandler("/projects/wine.huishuocs.com/data/pay_log/" . date('Y-m-d') . '.log'); $log = \Log::Init($logHandler, 15); //$streamData = isset($GLOBALS['HTTP_RAW_POST_DATA']) ? $GLOBALS['HTTP_RAW_POST_DATA'] : ''; $streamData = file_get_contents('php://input'); if ($streamData != '') { $arr = $this->xmlToArray($streamData); \Log::INFO('支付' . var_export($arr, true)); } else { $ret = false; } // 回调值 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'); } //将XML转为array public function xmlToArray($xml) { //禁止引用外部xml实体 libxml_disable_entity_loader(true); $values = json_decode(json_encode(simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOCDATA)), true); return $values; } } ?>
4. Front-end WeChat payment page wxpay.html
微信订单支付
订单已生成
该笔订单支付金额为:
echo $pay_price;
5. Jump to when payment is successful OrderController.class.php, order payment completed
/** * 支付页面 */ 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']) { //微信支付成功 $this->assign($info); $this->display(); } else { $this->assign($info); $this->assign('tips', "订购失败"); $this->assign('imgurl', "/wine/img/nook.png"); $this->display(); } }
At this point, the WeChat payment process ends.
Alipay payment
Without further ado, let’s go straight to the code!
Note:
1. The payment file is taken directly from Alipay
2. It is still a TP framework
[1]Put the file into a third party Class library:
(1)
* Class name: AlipayConfig.php
* Function: AlipayConfiguration file
* Modify configuration:
// MD5密钥,安全检验码,由数字和字母组成的32位字符串,查看地址:https://b.alipay.com/order/pidAndKey.htm $alipay_config['key'] = '';//(**从支付宝中获取**) // 服务器异步通知页面路径 需http://格式的完整路径,不能加?id=123这类自定义参数,必须外网可以正常访问 $alipay_config['notify_url'] = 'http://' . $_SERVER['SERVER_NAME'] . '/index.php/Wine/PayCallback/alipay_notify'; // 页面跳转同步通知页面路径 需http://格式的完整路径,不能加?id=123这类自定义参数,必须外网可以正常访问 $alipay_config['return_url'] = 'http://' . $_SERVER['SERVER_NAME'] . '/index.php?g=Wine&m=Orders&a=alipay_return';
(2)
* Class name: AlipayNotify.php
* Function: Alipay notification processing class
* Details: Process Alipay interface notification returns
(3 )
* Class name: Alipay.php
* Function: Mobile website payment interface access page
* Details: Process Alipay interface notifications and return
class Alipay { public function submit($params) { //建立请求 $alipaySubmit = new AlipaySubmit($alipay_config); $html_text = $alipaySubmit->buildRequestForm($parameter, "get", "确认"); return '支付宝支付 ' . $html_text . '