IOS订阅优惠-PHP生成ECDSA算法签名
<?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"') 来转一下格式