求大神帮忙 小程序支付 appid和openid不匹配
发布于 5 年前 作者 wumin 19112 次浏览 来自 问答

以下是代码

namespace app\api\service;

use app\api\model\Order as OrderModel;

use app\lib\enum\OrderStatusEnum;

use app\lib\exception\OrderException;

use app\lib\exception\TokenException;

use think\Exception;

use think\Loader;

use think\Log;

Loader::import(‘WxPay.WxPay’, EXTEND_PATH, ‘.Api.php’);

class Pay

{

    private $orderNo;

    private $orderID;

    function __construct($orderID)

    {

        if (!$orderID)

        {

            throw new Exception(‘订单号不允许为NULL’);

        }

        $this->orderID = $orderID;

    }

    public function pay()

    {

        $this->checkOrderValid();

        $order = new Order();       //这里是service的 Order

        $status = $order->checkOrderStock($this->orderID);

        if (!$status[‘pass’])

        {

            return $status;

        }

        return $this->makeWxPreOrder($status[‘orderPrice’]);

    }

    // 构建微信支付订单信息

    private function makeWxPreOrder($totalPrice)

    {

        $openid = Token::getCurrentTokenVar(‘openid’);

        if (!$openid)

        {

            throw new TokenException();

        }

        $wxOrderData = new \WxPayUnifiedOrder();

        $wxOrderData->SetOut_trade_no($this->orderNo);   //订单号

        $wxOrderData->SetTrade_type(‘JSAPI’);            //交易类型

        $wxOrderData->SetTotal_fee($totalPrice * 100);   //金额

        $wxOrderData->SetBody(‘测试’);               //设置商品或支付单简要描述

        $wxOrderData->SetOpenid($openid);                //用户的openid

        $wxOrderData->SetNotify_url(config(‘secure.pay_back_url’));  //设置接收微信支付异步通知回调地址

        return $this->getPaySignature($wxOrderData);

    }

    //向微信请求订单号并生成签名

    /**

     * @param $wxOrderData

     * @return array

     */

    private function getPaySignature($wxOrderData)

    {

        $wxOrder = \WxPayApi::unifiedOrder($wxOrderData);

        // 失败时不会返回result_code

        if($wxOrder[‘return_code’] != ‘SUCCESS’ || $wxOrder[‘result_code’] !=‘SUCCESS’){

            //dump($wxOrder);

            Log::record($wxOrder,‘error’);

            Log::record(‘获取预支付订单失败’,‘error’);

            //throw new Exception(‘获取预支付订单失败’);

        }

        $this->recordPreOrder($wxOrder);

        $signature = $this->sign($wxOrder);

        return $signature;

    }

    private function recordPreOrder($wxOrder){

        // 必须是update,每次用户取消支付后再次对同一订单支付,prepay_id是不同的

        OrderModel::where(‘id’, ‘=’, $this->orderID)

            ->update([‘prepay_id’ => $wxOrder[‘prepay_id’]]);

    }

    // 签名

    private function sign($wxOrder)

    {

        $jsApiPayData = new \WxPayJsApiPay();

        $jsApiPayData->SetAppid(config(‘wx.app_id’));

        $jsApiPayData->SetTimeStamp((string)time());

        $rand = md5(time() . mt_rand(0, 1000));

        $jsApiPayData->SetNonceStr($rand);

        $jsApiPayData->SetPackage(‘prepay_id=’ . $wxOrder[‘prepay_id’]);

        $jsApiPayData->SetSignType(‘md5’);

        $sign = $jsApiPayData->MakeSign();

        $rawValues = $jsApiPayData->GetValues();    //数组

        $rawValues[‘paySign’] = $sign;

        unset($rawValues[‘appId’]);

        return $rawValues;

    }

    /**

     * @return bool

     * @throws OrderException

     * @throws TokenException

     */

    private function checkOrderValid()

    {

        $order = OrderModel::where(‘id’, ‘=’, $this->orderID)

            ->find();

        if (!$order)

        {

            throw new OrderException();

        }

//        $currentUid = Token::getCurrentUid();

        if(!Token::isValidOperate($order->user_id))

        {

            throw new TokenException(

                [

                    ‘msg’ => ‘订单与用户不匹配’,

                    ‘errorCode’ => 10003

                ]);

        }

        if($order->status != OrderStatusEnum::UNPAID){

            throw new OrderException([

                ‘msg’ => ‘订单已支付过啦’,

                 ‘errorCode’ => 80003,

                ‘code’ => 400

            ]);

        }

        $this->orderNo = $order->order_no;

        return true;

    }

}

3 回复

小程序开发者工具–项目管理–新建项目–appid填写公司的小程序appid,后台同时根据公司appid获取openid。

你的appid确认是小程序的appid吗?建议你搜索关键词“appid和openid不匹配”看看往期开发者的问题反馈,再逐一排查

谢谢,我用的是个人小程序的appid,不是企业的,支付的信息填的是企业的.

回到顶部