准备工作:

  1. 发起方商户编号 parentMerchantNo
  2. 收款商户编号 merchantNo
  3. 应用标识 yappid
  4. 商户私钥 apiPrivateKey

参考文档:

  1. 支付文档,不建议参考。https://open.yeepay.com/docs/apis/INDUSTRY_SOLUTION/GENERAL/ptssfk/juhezhifu/options__rest__v1.0__aggpay__pre-pay
  2. 生成私钥文档,较为详细。https://open.yeepay.com/docs/open/platform-doc/developTools-sm/keyTools-sm

SDK下载:

Yop

SDK需要放到vendor目录,目录结构vendor/yoppay/xxxx

与官网提供的sdk不一样

添加微信配置(小程序为例)

public function addWxConfig()
{
    vendor('yoppay.YopRequest');
    $tradeAuthListArray = '["写自己的一级域名,结尾是/"]';//信任谁就加谁
    $appidListArray[] = [
        'appId' => '你的appId',
        'appSecret' => '你的appSecret',
        'appIdType' => 'MINI_PROGRAM',//OFFICIAL_ACCOUNT:公众号,MINI_PROGRAM:小程序
        'subscribeAppId' => '你的appId'//subscribeAppId 推荐关注appId,必传.可以写自己的
    ];//二维数组
    $appidList = json_encode($appidListArray);
    $request = new \YopRequest($this->yappid, $this->apiPrivateKey);
    $request->addParam("parentMerchantNo", $this->parentMerchantNo);     //发起方商户编号
    $request->addParam("merchantNo", $this->merchantNo);                //收款商户编号
    $request->addParam("tradeAuthDirList", $tradeAuthListArray);
    $request->addParam("appIdList", $appidList);
    vendor('yoppay.YopRsaClient');
    return \YopRsaClient::post("/rest/v2.0/aggpay/wechat-config/add", $request);
}

支付订单(聚合支付统一下单)

public function payOrder($data)
{
    vendor('yoppay.YopRequest');
    $request = new \YopRequest($this->yappid, $this->apiPrivateKey);
    $request->addParam("parentMerchantNo", $this->parentMerchantNo);//发起方商户编号
    $request->addParam("merchantNo", $this->merchantNo);//收款商户编号
    $request->addParam("orderId", $data['order_num']);//订单号
    $request->addParam("orderAmount", 0.01);//订单金额,单位是元,最小值0.01,只能是两位小数
    $request->addParam("goodsName", "出行");//商品信息
    $request->addParam("notifyUrl", '回调地址u');//回调通知地址
    $request->addParam("payWay", 'MINI_PROGRAM');//支付方式 MINI_PROGRAM==小程序
    $request->addParam("channel", 'WECHAT');//渠道类型 WECHAT / ALIPAY
    $request->addParam("appId", $this->appid);//appid
    $request->addParam("userId", 'openid');//openid,appid下对应的openid
    $request->addParam("userIp", '127.0.0.1');//ip 需填写真实的ip地址,代码在哪放着就写哪的ip
    $request->addParam("scene", 'OFFLINE');//必传,必传offline
    vendor('yoppay.YopRsaClient');
    $response = \YopRsaClient::post("/rest/v1.0/aggpay/pre-pay", $request);
    $data = $this->object_array($response);
    return json_decode($data['result']['prePayTn']);
}

回调

public function notifyx()
{
    include_once VENDOR_PATH . '/yoppay/Util/YopSignUtils.php';
    $source = $_REQUEST['response'];
    // 解密
    $result = \YopSignUtils::decrypt($source, $this->apiPrivateKey, $this->yeeversePublicKey);
    $result  = json_decode($result, 'true');
    //result包含数据,数据是去敏之后的数据
    $result =  array (
        'channelOrderId' => 'xxasdasd3666868',
        'orderId' => 'xxxxx0274',
        'bankOrderId' => 'xxxxx20',
        'paySuccessDate' => '2023-10-20 17:22:10',
        'channel' => 'WECHAT',
        'payWay' => 'MINI_PROGRAM',
        'uniqueOrderNo' => '1xxxxxx8314878066',
        'merchantName' => 'xzxxx服务有限公司',
        'orderAmount' => '0.01',
        'payAmount' => '0.01',
        'payerInfo' => '{"bankCardNo":"","bankId":"CFT","cardType":"DEBIT","mobilePhoneNo":"","userID":"asdasdnuldadsdt8o"}',
        'realPayAmount' => '0.01',
        'parentMerchantNo' => '65465463',
        'tradeType' => 'REALTIME',
        'merchantNo' => '56454618463',
        'status' => 'SUCCESS',
    );
    if ($result['status'] == 'SUCCESS') {
        //业务逻辑
        return 'SUCCESS';
    }
    return 'FAILED';
}

退款

public function yeeRefund()
{
    vendor('yoppay.YopRequest');
    $request = new \YopRequest($this->yappid, $this->apiPrivateKey);
    $refundOrderNum = '123346453';//退款订单号
    $request->addParam("parentMerchantNo", $this->parentMerchantNo);//商户号
    $request->addParam("merchantNo", $this->merchantNo);//商户号
    $request->addParam("orderId", '123456');//原来的支付订单号,自己生成的
    $request->addParam("refundRequestId", $refundOrderNum);//自己生成的退款请求订单号
    $request->addParam("refundAmount", 0.01);//退款金额
    vendor('yoppay.YopRsaClient');
    $response = \YopRsaClient::post("/rest/v1.0/trade/refund", $request);
    return $this->object_array($response);
}

公共部分

private $parentMerchantNo = '103421363';
private $merchantNo = '123453123';
private $appid = 'sdfgsdgb4';
private $yappid = 'app_1023523563';
private $apiPrivateKey = 'AA++M6Um5uivOVcAqqJpLwWuoStJKaTElMJ8qS/LRzadoiyZ+BiPDFHMueKCzPgsH6Rqw+JwL2u6e0RCMhbNu62uDmMSpsJGY2yMrZuC2F1AZI9pA+r6Ku/d+Iet09/D4qSSM=';
private $yeeversePublicKey = 'MIIBIjANBgkqhkiG9'

public function getUrl($response, $private_key)
{
    $content = $this->toString($response);
    include_once VENDOR_PATH . '/yoppay/Util/YopSignUtils.php';
    $sign = \YopSignUtils::signRsa($content, $private_key);
    $url = $content . "&sign=" . $sign;
    return $url;
}

public function toString($arraydata)
{
    $Str = "";
    foreach ($arraydata as $k => $v) {
        $Str .= strlen($Str) == 0 ? "" : "&";
        $Str .= $k . "=" . $v;
    }
    return $Str;
}

public function object_array($array)
{
    if (is_object($array)) {
        $array = (array)$array;
    }
    if (is_array($array)) {
        foreach ($array as $key => $value) {
            $array[$key] = Yee::object_array($value);
        }
    }
    return $array;
}