欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

IOS订阅优惠-PHP生成ECDSA算法签名

程序员文章站 2022-04-15 15:36:49
一些注意事项 openssl是可以直接进行ECDSA签名的 1、$nonce 必须为小写,并且每次购买时的nonce不能重复否则会报签名错误无法购买 code -12 2、$time 是毫秒time*1000 3、\u2063 的字符格式需要注意 php里面可以用户"\u{2063}" 来表示,但是 ......
<?php
use ramsey\uuid\uuid;

class itunessignaturegenerator {
    private $appbundleid = 'www.u17.com';

    private $keyidentifier = 'zzzzzzz';

    private $itunesprivatekeypath = '/path/to/the/file.p8;

    /**
     * @see https://developer.apple.com/documentation/storekit/in-app_purchase/generating_a_signature_for_subscription_offers
     *
     * @param $productidentifier
     * @param $offeridentifier
     *
     * @return signature
     */
    public function generatesubscriptionoffersignature($productidentifier, $offeridentifier)
    {
        $nonce = strtolower(uuid::uuid1()->tostring());
        $timestamp = time() * 1000;
        $applicationusername = 'username';

        $message = implode(
            "\u{2063}",
            [
                $this->appbundleid,
                $this->keyidentifier,
                $productidentifier,
                $offeridentifier,
                $applicationusername,
                $nonce,
                $timestamp
            ]
        );

        $message = $this->sign($message);

        return new signature(
            base64_encode($message),
            $nonce,
            $timestamp,
            $this->keyidentifier
        );
    }

    private function sign($data)
    {
        $signature = '';

        openssl_sign(
            $data,
            $signature,
            openssl_get_privatekey('file://' . $this->itunesprivatekeypath),
            openssl_algo_sha256
        );

        return $signature;
    }
}

一些注意事项   openssl是可以直接进行ecdsa签名的

1、$nonce 必须为小写,并且每次购买时的nonce不能重复否则会报签名错误无法购买 code -12

2、$time   是毫秒time*1000

3、\u2063 的字符格式需要注意    php里面可以用户"\u{2063}" 来表示,但是有的一些环境不支持这样的写法 所以还可以使用另外一种  json_decode('"\u2036"')  来转一下格式