//微信支付
本人是拿TP5框架
1.先从微信官网把SDK下载下来,在vendor根目录下边新建一个文件夹起名叫做wxpay,然后把ilb下边所有的文件放到新建的文件夹下边(wxpay), 再将 example 文件夹下的 WxPay.Config.php 拿出来,放到wxpay目录下,修改require_once所引入的路径,在配置起文件中所需的参数, 然后再去商户平台下载证书,最好放到有权限的文件夹下边,然后再修改修改 WxPay.Api.php 第二个require_once的路径,将其修改成require_once "WxPay.Config.php",新建一个控制器起名叫做wxpay.php,下边是本控制器的代码
<?php
namespace app\index\controller;
use think\Controller;
class Wxpay extends Controller
{
public function index(){
header("Content-type:text/html;charset=utf-8");
require VENDOR_PATH.'/wxpay/WxPay.Api.php'; //引入微信支付
$input = new \WxPayUnifiedOrder();//统一下单
$config = new \WxPayConfig();//配置参数
$paymoney = 1; //这个是测试的支付金额
$out_trade_no = 'WXPAY'.date("YmdHis"); //商户订单号
$goods_name = $paymoney.'元'; //商品名称
$input->SetBody($goods_name);
$input->SetAttach($goods_name);
$input->SetOut_trade_no($out_trade_no);
$input->SetTotal_fee($paymoney*100);//金额乘以100
$input->SetTime_start(date("YmdHis"));
$input->SetTime_expire(date("YmdHis", time() + 600));
$input->SetGoods_tag("test");
$input->SetNotify_url("http://www.xxx.com/wxpaynotifyurl"); //异步回调地址
$input->SetTrade_type("NATIVE");
$input->SetProduct_id("1");//商品id
$result = \WxPayApi::unifiedOrder($config, $input);
if($result['result_code']=='SUCCESS' && $result['return_code']=='SUCCESS') {
$url = $result["code_url"];
$this->assign('url',$url);
}else{
$this->error('参数错误');
}
return view();
}
}
2. 前台需要生成一个二维码,二维码中的内容是后台所返回的url,
把sdk中 example 文件夹下的 phpqrcode文件夹 和 qrcode.php 拿出来,放到自己可以找到的地方,本人是放到public下边,
最终再前台一行代码搞定
<img class="wxpay_img" src="/qrcode.php?data={$url}" alt="扫码支付">
//如果异步回调需要验证签名可以执行以下操作, 此处注意一点,这里的加密方式适合支付的加密方式一致
/* $obj 是接受的参数数组格式 $appwxpay_key 是微信的密钥
* 格式化参数格式化成url参数 生成签名sign
*/
private function appGetSign($Obj,$appwxpay_key)
{
foreach ($Obj as $k => $v)
{
$Parameters[$k] = $v;
}
//签名步骤一:按字典序排序参数
ksort($Parameters);
$String = $this -> ToUrlParams($Parameters);
//签名步骤二:在string后加入KEY
if($appwxpay_key){
$String = $String."&key=".$appwxpay_key;
}
//签名步骤三:加密
$String = hash_hmac('sha256',$String,$appwxpay_key);
//签名步骤四:所有字符转为大写
$result_ = strtoupper($String);
return $result_;
}
private function ToUrlParams($Parameters)
{
$buff = "";
foreach ($Parameters as $k => $v)
{
if($k != "sign" && $v != "" && !is_array($v)){
$buff .= $k . "=" . $v . "&";
}
}
$buff = trim($buff, "&");
return $buff;
}
这个就完成微信支付了
关于微信同步回调,在前台通过ajax 轮询的去请求接口,这个接口是查询微信异步回调所修改订单中的状态,直到请求回来,根据状态值来做出相应的操作。 本人的异步回调不是很完美,请多指教。
//支付宝支付
去支付宝将sdk下载,放到vendor文件夹下,然后就可以了,新建一个控制器,下边是代码
$out_trade_no = 2; //订单号(必填)
$subject = '测试'; //商品信息(必填)
$total_amount = 0.01; 支付金额(必填)
$body = ''; 商品描述(可为空)
vendor('alipay.pagepay.buildermodel.AlipayTradePagePayContentBuilder');
$payRequestBuilder = new \AlipayTradePagePayContentBuilder();
$payRequestBuilder->setBody($body);
$payRequestBuilder->setSubject($subject);
$payRequestBuilder->setTotalAmount($total_amount);
$payRequestBuilder->setOutTradeNo($out_trade_no);
vendor('alipay.pagepay.service.AlipayTradeService');
$config = config('zfbConfig'); //这个里边是支付宝的一些配置,本人是写到配置里边,
//这些是是所需要的配置
'app_id' => "",
//商户私钥
'merchant_private_key' => "",
//异步通知地址
'notify_url' => "",
//同步跳转
'return_url' => "",
//编码格
'charset' => "UTF-8",
//签名方式
'sign_type'=>"RSA2",
//支付宝网关
'gatewayUrl' => "https://openapi.alipay.com/gateway.do",
//支付宝公钥,查看地址:https://openhome.alipay.com/platform/keyManage.htm 对应APPID下的支付宝公钥。
'alipay_public_key' => "",
$aop = new \AlipayTradeService($config);
$response = $aop->pagePay($payRequestBuilder,$config['return_url'],$config['notify_url']);
将配置完成之后,就可以支付了 。。。
如果异步回调需要验证签名则执行以下操作
//$config 是支付宝的配置参数
//check 这个方式是sdk自带的,传入的必须是支付宝的公钥,一定切记
$alipaySevice = new \AlipayTradeService($config);
$result = $alipaySevice->check($data);