tp5支付宝和微信支付
一、生成二维码给用户进行扫码支付
1、先在vendor目录下加入支付宝和微信支付的引用
2、付款处调用
/**
* 订单支付接口
*
* @api {post} {:url('order/pay')} 前台订单支付二维码接口
* @apiName pay
* @apiGroup Order
* @apiParam {String} type 支付类型 alipay,wxpay
* @apiParam {String} sn 订单号
* @apiSuccess (200) {String} /uploads/tmp/testbfb0f121f0114a8238a8888ed116af50.png 支付二维码地址
*
*/
public function pay()
{
$type = input('type', 'alipay', 'trim');
$order_sn = input('sn', '', 'trim'); if (!$order_sn) {
return json(['msg' => '订单号错误'], 400);
} $pay = new Pay();
$order = db('orders')->where(['order_sn' => $order_sn, 'pay_status' => 0])->find();
if (!$order) {
return json(['msg' => '订单没有找到'], 400);
}
if ($order['pay_status'] == 1) {
return json(['msg' => '订单已经支付, 请勿重复支付!'], 400);
} try {
switch ($type) {
case 'alipay':
$data = [
'out_trade_no' => $order['order_sn'],
'subject' => $order['cust_name'] . "扫码支付",
'total_amount' => $order['payment_amount'],
'timeout_express' => "30m",
];
$pay->ali_pay($data);
// echo "uploads/tmp/testbfb0f121f0114a8238a8888ed116af50.png";
break;
case 'wxpay':
$data = [
'body' => $order['cust_name'],
'total_fee' => $order['payment_amount'] * 100,
'out_trade_no' => $order['order_sn'],
'product_id' => $order['order_sn'],
'trade_type' => 'NATIVE'
];
$pay->wx_pay($data);
// echo "uploads/tmp/testbfb0f121f0114a8238a8888ed116af50.png";
break;
case 'under_pay'://线下汇款
$bool = db('orders')->where('order_sn',$order_sn)->update(['pay_status'=>1]);
if($bool){
return json(['msg'=>"订单完成"],200);
}else{
return json(['msg'=>"订单支付异常"],400);
} }
} catch (\Exception $e) {
return json(['msg' => $e->getMessage()], 400);
}
}
Pay.php文件
<?php namespace app\index\pay; use think\Exception; if (!defined("AOP_SDK_WORK_DIR"))
{
define("AOP_SDK_WORK_DIR", TEMP_PATH);
} class Pay
{
private $config = []; public function ali_pay($order)
{
vendor('alipay.AopSdk');
$info = db('pay_config')
->field('fpay_value,public_key,private_key')
->where(['ftype' => 'alipay','fstatus'=>1])
->find(); $this->config = array(
//签名方式,默认为RSA2(RSA2048)
'sign_type' => "RSA2",
//支付宝公钥
'alipay_public_key' => $info['public_key'],
//商户私钥
'merchant_private_key' => $info['private_key'],
//应用ID
'app_id' => $info['fpay_value'],
//异步通知地址,只有扫码支付预下单可用
'notify_url' => url('index/alipay/notify', '', '', true),//支付后回调接口
//'notify_url' => "http://requestbin.net/r/1bjk7931",
//最大查询重试次数
'MaxQueryRetry' => "10",
//查询间隔
'QueryDuration' => "3",
); try {
$alipay = new AlipayTradeService($this->config);
$response = $alipay->qrPay($order);
$alipay->create_erweima($response->qr_code);
} catch (\Exception $e) {
throw new Exception($e->getMessage());
} } public function wx_pay($order)
{
$info = db('pay_config')->where(['ftype' => 'wxpay'])->value('fpay_value');
vendor('Weixinpay.Weixinpay');
$info = json_decode($info, true);
$this->config = [
'APPID' => $info['fappid'], // 微信支付APPID
'MCHID' => $info['fmchid'], // 微信支付MCHID 商户收款账号
'KEY' => $info['fappkey'], // 微信支付KEY
'APPSECRET' => $info['fappsecret'], //公众帐号secert
'NOTIFY_URL' => url('index/wxpay/notify', '', '', true), // 接收支付状态的连接 改成自己的域名
]; $wxpay = new \Weixinpay($this->config);
$wxpay->pay($order);
}
}
(1)支付宝相关接口代码
AlipayTradeService.php
<?php namespace app\index\pay;
use think\Exception; class AlipayTradeService
{ //支付宝网关地址
public $gateway_url = "https://openapi.alipay.com/gateway.do"; //异步通知回调地址
public $notify_url; //签名类型
public $sign_type; //支付宝公钥地址
public $alipay_public_key; //商户私钥地址
public $private_key; //应用id
public $appid; //编码格式
public $charset = "UTF-8"; public $token = NULL; //重试次数
private $MaxQueryRetry; //重试间隔
private $QueryDuration; //返回数据格式
public $format = "json"; function __construct($alipay_config)
{
$this->appid = $alipay_config['app_id'];
$this->sign_type = $alipay_config['sign_type'];
$this->private_key = $alipay_config['merchant_private_key'];
$this->alipay_public_key = $alipay_config['alipay_public_key'];
$this->MaxQueryRetry = $alipay_config['MaxQueryRetry'];
$this->QueryDuration = $alipay_config['QueryDuration'];
$this->notify_url = $alipay_config['notify_url']; if (empty($this->appid) || trim($this->appid) == "") {
throw new Exception("appid should not be NULL!");
}
if (empty($this->private_key) || trim($this->private_key) == "") {
throw new Exception("private_key should not be NULL!");
}
if (empty($this->alipay_public_key) || trim($this->alipay_public_key) == "") {
throw new Exception("alipay_public_key should not be NULL!");
}
if (empty($this->charset) || trim($this->charset) == "") {
throw new Exception("charset should not be NULL!");
}
if (empty($this->QueryDuration) || trim($this->QueryDuration) == "") {
throw new Exception("QueryDuration should not be NULL!");
}
if (empty($this->gateway_url) || trim($this->gateway_url) == "") {
throw new Exception("gateway_url should not be NULL!");
}
if (empty($this->MaxQueryRetry) || trim($this->MaxQueryRetry) == "") {
throw new Exception("MaxQueryRetry should not be NULL!");
}
if (empty($this->sign_type) || trim($this->sign_type) == "") {
throw new Exception("sign_type should not be NULL");
} } //当面付2.0预下单(生成二维码,带轮询)
public function qrPay($order)
{
vendor('alipay.AopSdk'); $order = json_encode($order,JSON_UNESCAPED_UNICODE); $this->writeLog($order); $request = new \AlipayTradePrecreateRequest();
$request->setBizContent($order);
$request->setNotifyUrl($this->notify_url); // 首先调用支付api
$response = $this->aopclientRequestExecute($request, NULL, NULL);
$response = $response->alipay_trade_precreate_response; if (!empty($response) && ("10000" == $response->code)) {
return $response;
} elseif ($this->tradeError($response)) {
throw new Exception($response->code.":".$response->msg);
} else {
throw new Exception($response->code.":".$response->msg."(".$response->sub_msg.")");
}
} /**
* 使用SDK执行提交页面接口请求
* @param unknown $request
* @param string $token
* @param string $appAuthToken
* @return string $$result
*/
private function aopclientRequestExecute($request, $token = NULL, $appAuthToken = NULL)
{ $aop = new \AopClient ();
$aop->gatewayUrl = $this->gateway_url;
$aop->appId = $this->appid;
$aop->signType = $this->sign_type;
$aop->rsaPrivateKey = $this->private_key;
$aop->alipayrsaPublicKey = $this->alipay_public_key;
$aop->apiVersion = "1.0";
$aop->postCharset = $this->charset; $aop->format = $this->format;
// 开启页面信息输出
$aop->debugInfo = true;
$response = $aop->execute($request, $token, $appAuthToken); //打开后,将url形式请求报文写入log文件
$this->writeLog("response: " . var_export($response, true));
return $response;
} // 交易异常,或发生系统错误
protected function tradeError($response)
{
return empty($response) ||
$response->code == "20000";
} function writeLog($text)
{
// $text=iconv("GBK", "UTF-8//IGNORE", $text);
//$text = characet ( $text );
file_put_contents(RUNTIME_PATH."log/log.txt", date("Y-m-d H:i:s") . " " . $text . "\r\n", FILE_APPEND);
} function create_erweima($content) {
//$content = urlencode($content);
qrcode($content);
}
/**
* 验签方法
* @param $arr 验签支付宝返回的信息,使用支付宝公钥。
* @return boolean
*/
function check($arr){
$aop = new \AopClient();
$aop->alipayrsaPublicKey = $this->alipay_public_key;
$result = $aop->rsaCheckV1($arr, $this->alipay_public_key, $this->sign_type); return $result;
}
}
index/alipay/notify.php---扫码支付后调用接口
<?php namespace app\index\controller; use app\index\pay\AlipayTradeService as JKAlipayTradeService;
use think\Controller; class Alipay extends Controller
{
/**
* notify_url接收页面
*/
public function notify()
{
// 引入支付宝
vendor('Alipay.AopSdk');
$info = db('pay_config')
->field('fpay_value,public_key,private_key')
->where(['ftype' => 'alipay','fstatus'=>1])
->find(); $config = array(
//签名方式,默认为RSA2(RSA2048)
'sign_type' => "RSA2",
//支付宝公钥
'alipay_public_key' => $info['public_key'],
//商户私钥
'merchant_private_key' => $info['private_key'],
//应用ID
'app_id' => $info['fpay_value'],
//异步通知地址,只有扫码支付预下单可用
'notify_url' => url('index/alipay/notify', '', '', true),
//最大查询重试次数
'MaxQueryRetry' => "10",
//查询间隔
'QueryDuration' => "3",
);
$alipaySevice = new JKAlipayTradeService($config);
$alipaySevice->writeLog(var_export($_POST,true));
//$result = $alipaySevice->check($_POST);
$out_trade_no = $_POST['out_trade_no']; if ($_POST['trade_status'] == 'TRADE_FINISHED' || $_POST['trade_status'] == 'TRADE_SUCCESS') { if ($order = db('orders')->where("order_sn", $out_trade_no)->find()) {
if ($order['pay_status'] != 1) {
db("orders")
->where("order_sn", $out_trade_no)
->update(['pay_status' => 1,'status'=>2]);
// 付款单创建
db('payment_bills')->insert([
'cust_code'=>$order['cust_code'],
'cust_name'=>$order['cust_name'],
'payment_type'=>'alipay',
'amount'=>$order['payment_amount'],
'payment_time'=>date('Y-m-d H:i:s'),
'trade_no'=>$_POST['trade_no'],
'status'=>1,
'created_at'=>date('Y-m-d H:i:s'),
'updated_at'=>date('Y-m-d H:i:s'),
]);
}
}
}
echo "success";
} }
(2)微信相关接口代码
index/wxpay/notify
<?php namespace app\index\controller; use think\Controller; class Wxpay extends Controller
{
/**
* notify_url接收页面
*/
public function notify()
{
// 获取xml
$xml=file_get_contents('php://input', 'r');
//转成php数组 禁止引用外部xml实体
libxml_disable_entity_loader(true);
$data= json_encode(simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOCDATA));
file_put_contents('./notify.text', $data); // 导入微信支付sdk
Vendor('Weixinpay.Weixinpay');
$info = db('pay_config')->where(['ftype' => 'wxpay'])->value('fpay_value');
$info = json_decode($info, true);
$config = [
'APPID' => $info['fappid'], // 微信支付APPID
'MCHID' => $info['fmchid'], // 微信支付MCHID 商户收款账号
'KEY' => $info['fappkey'], // 微信支付KEY
'APPSECRET' => $info['fappsecret'], //公众帐号secert
'NOTIFY_URL' => url('index/wxpay/notify', '', '', true), // 接收支付状态的连接 改成自己的域名
]; $wxpay = new \Weixinpay($config);
$result = $wxpay->notify(); if ($result) {
// 验证成功 修改数据库的订单状态等 $result['out_trade_no']为订单id
$map = [
'order_sn' => $result['out_trade_on'],
'status' => 2
];
if ($order = db('orders')->where($map)->find()) {
if ($order['pay_status'] != 1) {
db("orders")->where("order_sn", $result['out_trade_on'])->update(['pay_status' => 1]);
} // 付款单创建
db('payment_bills')->insert([
'cust_code'=>$order['cust_code'],
'cust_name'=>$order['cust_name'],
'payment_type'=>'wxpay',
'amount'=>$order['payment_amount'],
'account'=>isset($data['openid'])?$data['openid']:"",
'payment_time'=>date('Y-m-d H:i:s'),
'trade_no'=>isset($result['transaction_id'])?$result['transaction_id']:'',
'status'=>1,
'created_at'=>date('Y-m-d H:i:s'),
'updated_at'=>date('Y-m-d H:i:s'),
]);
}
}
}
}
二、用户提供二维码进行支付
tp5支付宝和微信支付的更多相关文章
- ThinkPHP 提供Auth 权限管理、支付宝、微信支付、阿里oss、友盟推送、融云即时通讯、云通讯短信、Email、Excel、PDF 等等
多功能 THinkPHP 开源框架 项目简介:使用 THinkPHP 开发项目的过程中把一些常用的功能或者第三方 sdk 整合好,开源供亲们参考,如 Auth 权限管理.支付宝.微信支付.阿里oss. ...
- Android 支付宝以及微信支付快速接入流程
简介 随着移动支付的普及,越来越多的App采用第三发支付,在这里我们以支付宝为例,做一个快速集成! 一.Android快速实现支付宝支付 1.首先,我们需要前往支付宝开放平台,申请我们的支付功能:ht ...
- 简聊iOS支付集成(支付宝和微信支付)
一.支付集成是什么 1.现在大部分app都有快捷支付功能,支付集成将第三方支付平台集成到自己的项目中,能够完成自己项目中的支付功能, 二.支付集成的使用 <1>.支付宝: 下载SDK和De ...
- Android开发——支付宝和微信支付快速接入流程
一.Android快速实现支付宝支付 1.首先,我们需要前往支付宝开放平台,申请我们的支付功能:https://open.alipay.com/platform/home.htm 支付宝首页 这里 有 ...
- Android接入支付宝和微信支付
然后把下载下来的aar包,放到项目目录下面的libs目录下,通过下面的gradle依赖进来 // 支付宝 SDK AAR 包所需的配置compile(name: 'alipaySdk-15.6.0-2 ...
- uni-app调用支付宝、微信支付
项目中要用到支付功能,现在来看支付宝.微信应该是必选的两个方式了. uni-app 文档中要求:APP端 微信 和 支付宝的 orderInfo 必须是 字符串. 调用支付宝时,支付宝直接返回的 or ...
- PHP实现一个二维码同时支持支付宝和微信支付
实现思路 生成一个二维码,加入要处理的url连接 在用户扫完码后,在对应的脚本中,判断扫码终端,调用相应的支付 若能够扫码之后能唤起相应app,支付宝要用手机网站支付方式,微信要使用jsapi支付方式 ...
- .net core 支付宝,微信支付 三
支付回调: 获取HttpRequest的body内容,之前使用Request.Form有时候数据请求不到(可能是跟.net core 版本有关?) var s = HttpRequest.Body; ...
- .net core 支付宝,微信支付 一
源码: https://github.com/aspros-luo/Qwerty.Payment/tree/develop 支付宝支付:参考支付宝sdk及文档,https://docs.open.al ...
随机推荐
- Selenium报错:StaleElementReferenceException
一个学生在操作页面跳转时遇到一个Selenium报错, 如下图所示: StaleElementReferenceException: Message: stale element reference: ...
- Codeforces 1111 E. Tree(虚树,DP)
题意 有一棵树,q个询问,每次询问,指定一个点做树根,再给定k个点,要求把这些点分成不超过m组的方案数,分配的限制是任意两个有祖先关系的点不能分在同一组.题目还保证了所有的询问的k加起来不超过1e5. ...
- Mybatis源码学习之类型转换(四)
简述 JDBC数据类型与Java语言中的数据类型并不是完全对应的,所以在PreparedStatement为SQL语句绑定参数时,需要从Java类型转换成JDBC类型,而从结果集中获取数据时,则需要从 ...
- csp-s模拟80(b)
头一次中午考试,上来一看三个题目以为是三个板子,但一看数据范围就不对劲. T1: 考场上的想法是:找出循环节,对于数组一头一尾的不在循环节中的,维护出以某数结尾/开头的上升序列,对于中间的循环部分只取 ...
- CISCO实验记录二:路由器基本操作
一.路由器基本操作要求 1.设置路由器本地时间 2.启用光标跟随 3.设置路由器标语信息和描述信息 4.为接口配置描述信息 5.快速恢复接口到出厂设置 二.路由器基本操作命令 1.设置路由器本地时间 ...
- git push and git pull
原文链接 git push 通常对于一个本地的新建分支,例如git checkout -b develop, 在develop分支commit了代码之后,如果直接执行git push命令,develo ...
- YOLO: You Only Look Once论文阅读摘要
论文链接: https://arxiv.org/pdf/1506.02640.pdf 代码下载: https://github.com/gliese581gg/YOLO_tensorflow Abst ...
- 安装nodejs 后运行 npm 命令无响应
安装和卸载过nodejs, 也编辑过 C:\Users\{账户}\下的.npmrc文件. 再全新安装nodejs ,运行npm 命令,无响应. 处理方法,删除C:\Users\{账户}\下的.npmr ...
- 异步发送表单数据到JavaBean,并响应JSON文本返回
1) 提交表单后,将JavaBean信息以JSON文本形式返回到浏览器 <form> 编号:<input type="text" name="id&q ...
- weight权重的属性
权重是把屏幕剩余空间按比例分配 控件使用0dp,则实际的宽度比就等于权重比 控件wrap_content,那么权重越大,位置占的越多,再小不过wrap_content 控件match_parent,那 ...