• 首页 首页 icon
  • 工具库 工具库 icon
    • IP查询 IP查询 icon
  • 内容库 内容库 icon
    • 快讯库 快讯库 icon
    • 精品库 精品库 icon
    • 问答库 问答库 icon
  • 更多 更多 icon
    • 服务条款 服务条款 icon

php,tp5 微信小程序支付v2

武飞扬头像
凯萨王
帮助1

注意:本文主要讲关于php后端的问题

一.配置小程序相关工作 (v2文档

1.整理小程序引用文件目录

下面是我自己进行的配置。
使用了tp5.2的框架,下载SDK(这个虽然是扫码支付的demo,下载之后你会看见,这几种支付,它都有),在extend文件夹下新建wxpay文件夹,将如下需要的文件,放到wxpay文件夹下。如图
学新通

2.修改配置文件

修改WxPay.Config.php配置文件,添加支付appid和商户号,如图:
学新通

二.统一下单接口

1.下单获取prepay_id

统一下单接口文档链接(注意:接口文档最好熟读几遍,遇到问题,不要慌,先看一下文档,自己阅读后你会发现,有些问题,可能只是大小写的问题)

require_once EXTEND_PATH.'/wxpay/WxPay.Data.php';//引入微信支付
require_once EXTEND_PATH.'/wxpay/WxPay.Config.php';//配置
require_once EXTEND_PATH.'/wxpay/WxPay.Api.php';
$wxPayUnifiedOrder = new \WxPayUnifiedOrder();
$wxPayUnifiedOrder->SetBody($goodName);//商品描述
$wxPayUnifiedOrder->SetOut_trade_no($orderNumber);//商户订单号
$wxPayUnifiedOrder->SetTotal_fee($orderMoney);//支付金额,整数,最小单位是分
$wxPayUnifiedOrder->SetFee_type('CNY');
$wxPayUnifiedOrder->SetTime_start(date("YmdHis",$time));//交易起始时间
$wxPayUnifiedOrder->SetTime_expire(date("YmdHis",$time   1800));//交易结束时间,30分钟
$wxPayUnifiedOrder->SetNotify_url($callBackUrl);//这里写你的回调地址
$wxPayUnifiedOrder->SetTrade_type("JSAPI");//交易类型
$wxPayUnifiedOrder->SetProduct_id($id);//商品id
$wxPayUnifiedOrder->SetOpenid($openId']);//open_id,我这是前端传给我的
$config = new \WxPayConfig();
$result = \WxPayApi::unifiedOrder($config, $wxPayUnifiedOrder);
学新通

unifiedOrder这个方法是sdk自带的,直接引用即可,返回的结果也不用特殊处理,直接返回数组形式。
这里最好把返回值记录一下,看一下结果,方便开发。

2.判断返回值,并返回给小程序端支付的参数

接着1的代码,判断其返回状态

if(isset($result['return_code'])&&isset($result['result_code'])&&$result['result_code']=='SUCCESS'&&$result['return_code']=='SUCCESS'){
    $prepayId = $result['prepay_id'];
    $newData = [
        'appId'=>$config->GetAppId,//这里需要注意,前面的参数名称一定要i这么大写,否则小程序会提示验证签名失败
        'nonceStr'=>$result["nonce_str"],// 随机32位字符串
        'package'=>'prepay_id='.$prepayId,
        'signType'=>$config->GetSignType(),//在WxPay.Config.php文件里能看见对应的配置
        'timeStamp'=>(string)time()
    ];

    $string = '';
    foreach ($newData as $key=>$value){
        if(!$value) continue;
        if($string) {
            $string .= '&'.$key."=".$value;
        }else {
            $string = $key."=".$value;
        }
    }
    $string = $string . "&key=".$config->GetKey();
    $string = hash_hmac("sha256",$string ,$config->GetKey());//生成签名
    $newData['pay_sign'] =  strtoupper($string);
    $newData['signType'] = $config->GetSignType();
    unset($newData['app_id']);//保密处理,不在接口端返回app_id
}
学新通

直接组成小程序参数,返回给前端
(在返回小程序段之前,会将当前的订单信息,保存到数据库中,这里就不多写了。)

三.查询订单状态

1.在数据里面查询订单状态

在数据里面查询订单状态,以及订单的过期时间。如果订单已经过期了,或者订单不存在,要给前端返回对应的状态。(这里我偷懒了,不写了)

2.根据订单号,查询订单状态

require_once EXTEND_PATH.'/wxpay/WxPay.Data.php';//引入微信支付
require_once EXTEND_PATH.'/wxpay/WxPay.Config.php';//配置
require_once EXTEND_PATH.'/wxpay/WxPay.Api.php';
$config = new \WxPayConfig();
$input = new \WxPayOrderQuery();
$input->SetOut_trade_no($outTradeNo);//订单编号
$result = \WxPayApi::orderQuery($config, $input);
if(isset($result['trade_state'])&&$result['trade_state']=='SUCCESS'){
	return ['code'=>'SUCCESS'];
}

当状态是成功时,返回前端,前端进行页面处理。

四.回调处理

    /**
     * 回调接口
     */
    public function notify(){
        try{
            //获取通知的数据
            $resultData = file_get_contents("php://input");
            $requestHead = request()->header();
            /**记录一下回调内容,并保存日志**/
            $this->saveLog($fileName, $resultData );
            if (empty($resultData)) {
                # 如果没有数据,直接返回失败
                throw new Exception('回调数据为空');
            }
            $jsonxml = json_encode(simplexml_load_string($resultData, 'SimpleXMLElement', LIBXML_NOCDATA));
            $result = json_decode($jsonxml, true);
            if (empty($result) ||$result['return_code'] != 'SUCCESS' || $result['result_code'] != 'SUCCESS') {
                throw new Exception('支付失败:'.$resultData);
            }
            $tradeNom      = $result['out_trade_no']; //商户自定义订单号
            $transactionId = $result['transaction_id']; //微信交易单号
			
            /**
            *处理逻辑
            *更新订单状态
            *这里需要注意,回调接口会重复调用,需要判断一下订单状态,避免重复更新。
            **/
            
            return true;
        }catch (Exception $exception){
            //记录错误日志
            $this->saveLog($fileName, $exception->getMessage());
            return false;
        }
    }
学新通

这里需要注意,回调接口会重复调用,需要判断一下订单状态,避免重复更新

五.总结

做的时候,觉得很复杂,做完了之后,发现也没有那么复杂。有什么不懂的,就多读几遍文档,文档很重要。
(这是自己的一个记录,若有不足,希望指出。(* ̄︶ ̄)

这篇好文章是转载于:学新通技术网

  • 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
  • 本站站名: 学新通技术网
  • 本文地址: /boutique/detail/tanhgfegbg
系列文章
更多 icon
同类精品
更多 icon
继续加载