业务需求
客户需要在app上、web网站上接入微信支付支付
1.准备
前期准备商家在微信、蚂蚁金服申请支付,具体流程参考支付文档申请流程
2.配置
前期我将一些配置配置在与database.php文件目录的config.php文件下,具体代码如下:
配置
在tp5配置页面config.php文件配置,配置如下
<?php return [
// +------------------------------------------------------------
// 应用设置
// +------------------------------------------------------------
// 应用命名空间
'app_namespace' => 'app',
// 应用调试模式
'app_debug' => false,
// 应用Trace
'app_trace' => false,
// 应用模式状态
'app_status' => '',
// 是否支持多模块
'app_multi_module' => true,
// 入口自动绑定模块
'auto_bind_module' => false,
// 注册的根命名空间
'root_namespace' => [],
// 扩展配置文件
'extra_config_list' => ['database', 'validate'],
// 扩展函数文件
'extra_file_list' => [THINK_PATH . 'helper' . EXT],
// 默认输出类型
'default_return_type' => 'html',
// 默认AJAX 数据返回格式,可选json xml ...
'default_ajax_return' => 'json',
// 默认JSONP格式返回的处理方法
'default_jsonp_handler' => 'jsonpReturn',
// 默认JSONP处理方法
'var_jsonp_handler' => 'callback',
// 默认时区
'default_timezone' => 'PRC',
// 是否开启多语言
'lang_switch_on' => false,
// 默认全局过滤方法 用逗号分隔多个
'default_filter' => '',
// 默认语言
'default_lang' => 'zh-cn',
// 应用类库后缀
'class_suffix' => false,
// 控制器类后缀
'controller_suffix' => false,
// | 缓存设置 // +--------------------------------------------------
'cache' => [
// 驱动方式
'type' => 'File',
// 缓存保存目录
'path' => CACHE_PATH,
// 缓存前缀
'prefix' => '',
// 缓存有效期 0表示永久缓存
'expire' => 0, ],
// +---------------------------------------------------------------------- // | 会话设置 // +----------------------------------------
'session' => [
'id' => '',
// SESSION_ID的提交变量,解决flash上传跨域
'var_session_id' => '',
// SESSION 前缀
'prefix' => 'dspx',
// 驱动方式 支持redis memcache memcached
'type' => '',
// 是否自动开启 SESSION
'auto_start' => true, ],
// +---------------------------------------------------------------------- // | Cookie设置 // +----------------------------------------------------------------------
'cookie' => [
// cookie 名称前缀
'prefix' => '',
// cookie 保存时间
'expire' => 0,
//cookie 保存路径
'path' => '/',
// cookie 有效域名
'domain' => '',
// cookie 启用安全传输
'secure' => false,
// httponly设置
'httponly' => '',
// 是否使用 setcookie
'setcookie' => true, ],
'AUTH_CODE' => 'zheng_an',
//分页配置
'paginate' => [
'type' => 'bootstrap',
'var_page' => 'page',
'list_rows' => 15,
],
//设置项目域名
'domain'=> 'http://www.test.com',
'speed_domain' =>'http://play.test.com',
//微信开发平台支付相关配置设置
// 'OPEN_APPID'=>'jiade',
//微信开放平台的应用appid
// 'OPEN_MCHID'=>'jiade',
//商户号(注册商户平台时,发置注册邮箱的商户id)
// 'OPEN_KEY'=>'jiade',
//商户平台api支付处设置的key
'OPEN_APPID'=>'jiade',
'OPEN_MCHID'=>'jiade',
'OPEN_KEY'=>'jiade', // jiade
//微信公众平台支付相关配置设置
"KEY" => 'jiade',
//商户API 密钥
"APPID" => 'jiade',
//公众号appID
"SECRET" => 'jiade',
//公众号AppSecret
"MCHID" => 'jiade',//商户号id
//支付宝相关配置 'PRIVATEKEY' => '/g0Xro4NZLNpZxJBVaCeL7sGkCgYEA0pgBNt+7OOCLAVVRApHeJXiZXDeWjIoAu/RcBCYvldgYhdVJHTil3c7/73HVk9gLYkW9DFelJk5xYNwO4tYLRhwPiPK0dQUFaHgqJhwjLF6AnbFHy4FmbW3FaQahBezKfsAgkvXJDSc970HkjBMN3ajejUy8MCL6wR+xsB16adcCgYB5o6PnTWRYirWiFrKMOzNBaGTU9K3/sxji2sa7w+CSdx8X89beHH46K8IgBIvY/Y+H2r8tI0eO0XLrcetq+jtfSto4O/0P+5Z5ca4vP8YYr6ZVU8xj6aNE0t3U923o5RVCeinBNR6Yv6DVru7Dww62Yp+tGBYOK9hBJvjIItRdYQKBgDIRO3CtXliWYdXuT7U5ssPb2TIocR12jdghr2K5JWUNnD7tR1WwKxcB6K0ntixRF9vEUr7Fc5kY2zG4/70EQGfpsfPQKAEOMYv1zaeD1wTsbs2O4U/LsutfRqjCj7PV6QqbaOMnliYPZ1UjqE95FDnXtRmI3dDf8BfMDjWdvIW/AoGAYDBvoYQiBZej1+/cwOC2cioHhqIwz2V89wBMRi3XoTsyTKYYLDHqJBqu1BQNcyrNof1uX45zTDE0Zgsx6uksAYz/Udof/92rqJS7PEpDf2IWdzXiZJaMDDhgHi8CP2qP+K+n1s3cxnUR3OtGDQfyXCIQCiXE0CTPmgAnRPLeY5A=',
//商户应用私钥 'PUBLICKEY' => 'jiade',
//支付宝公钥 'ALIAPPID' => 'jiade',//支付宝APPID //
//微信开发平台支付相关配置设置
// 'OPEN_APPID'=>'jiade',
//微信开放平台的应用appid //
'OPEN_MCHID'=>'jiade',////商户号(注册商户平台时,发置注册邮箱的商户id)
// 'OPEN_KEY'=>'jiade',//商户平台api支付处设置的key ];
下单调用逻辑
<?php
/** * Created by PhpStorm. * User: ljy * Date: 17/10/14 * Time: 下午3:33 */
namespaceapp\api\controller;
usePingpp\Pingpp;
usePingpp\Charge;
require('../extend/Pingpp/init.php');
usethink\Request;
usethink\Db;
useWeChatPay\WeChatPay;
useWeChatPay\Notify;
include('../extend/alipay/AopSdk.php');
/** *商城确认订单支付 */
publicfunction pay_order(){
// $data = $this->getPost();
// $arr = $this->XmlToArr($data);
$member = $this->checklogin(); //记录数据到日志中
$weChat = new WeChatPay();
$body = "商城订单";
$order_no=input('order_no');
$type = input('type');
$hotel_order = Db::name('order')->where(['order_no' => $order_no,'member_id'=>$member['member_id']])->find();
if (!$hotel_order) error("订单错误");
$total_fee = 1;
switch ($type) {
case'wx_pub_qr':
$Qurl = $weChat->wechat_getcode($order_no . "B" . time());
success($Qurl);
break;
case'wx':
$weChat->wechat_apppay($body, $order_no . "B" . time(), $total_fee);
break;
case'ali_app':
$aop = new \AopClient;
$aop->gatewayUrl = "https://openapi.alipay.com/gateway.do";
$aop->appId = config('ALIAPPID');
$aop->rsaPrivateKey = config('PRIVATEKEY');
$aop->format = "json";
$aop->charset = "UTF-8";
$aop->signType = "RSA2";
$aop->alipayrsaPublicKey = config('PUBLICKEY');
//实例化具体API对应的request类,类名称和接口名称对应,当前调用接口名称:
alipay.trade.app.pay$request = new \AlipayTradeAppPayRequest();
//SDK已经封装掉了公共参数,这里只需要传入业务参数
$out_trade_no = $order_no . "B" . time();
$bizcontent = "{\"body\":\"".$body."\"," . "\"subject\": \"AliApp\"," . "\"out_trade_no\": \"".$out_trade_no."\"," . "\"timeout_express\": \"30m\"," . "\"total_amount\": \"0.01\"," . "\"product_code\":\"QUICK_MSECURITY_PAY\"" . "}";
$request->setNotifyUrl("http://www.zhongfeigou.com/api/pingxx/alipayCallback");
$request->setBizContent($bizcontent);
//这里和普通的接口调用不同,使用的是sdkExecute
$response = $aop->sdkExecute($request);
//htmlspecialchars是为了输出到页面时防止被浏览器将关键参数html转义,实际打印到日志以及http传输不会有这个问题// echo htmlspecialchars($response);
//就是orderString 可以直接给客户端请求,无需再做处理。
$data = $response;
success($data);
break;
case'alipay_wap':
require_once ('../extend/alipaywap/config.php');
require_once ('../extend/alipaywap/pagepay/service/AlipayTradeService.php');
require_once ('../extend/alipaywap/pagepay/buildermodel/AlipayTradePagePayContentBuilder.php');
//商户订单号,商户网站订单系统中唯一订单号,必填//
$out_trade_no = trim($_POST['WIDout_trade_no']);
$out_trade_no = $order_no . "B" . time(); //订单名称,必填//
$subject = trim($_POST['WIDsubject']);
$subject = 'AliWap'; //付款金额,必填//
$total_amount = trim($_POST['WIDtotal_amount']);
$total_amount = '0.01'; //商品描述,可空//
$body = trim($_POST['WIDbody']);//构造参数
$payRequestBuilder = new \AlipayTradePagePayContentBuilder();
$payRequestBuilder->setBody($body);
$payRequestBuilder->setSubject($subject);
$payRequestBuilder->setTotalAmount($total_amount);
$payRequestBuilder->setOutTradeNo($out_trade_no);
$aop = new \AlipayTradeService($config);
/** * pagePay 电脑网站支付请求
* @param $builder 业务参数,使用buildmodel中的对象生成。
* @param $return_url 同步跳转地址,公网可以访问
* @param $notify_url 异步通知地址,公网可以访问
* @return $response 支付宝返回的信息
*/
$response = $aop-
>pagePay($payRequestBuilder,$config['return_url'],$config['notify_url']);
//输出表单
var_dump($response);
break;
default:
# code...
break;
}