Я использую следующую функцию (серверная php) для проверки транзакции IAB v3:
Я перехожу из приложения Android:
@Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { String signed_data=data.getStringExtra(IabHelper.RESPONSE_INAPP_PURCHASE_DATA); String signature=data.getStringExtra(IabHelper.RESPONSE_INAPP_SIGNATURE);
У меня такое чувство, что это может быть связано с подписью, которую я прохожу. Я использую следующий метод Android для его кодирования, потому что без кодирования я получаю сообщение об ошибке:
public String URLsafe(String text){ try { return URLEncoder.encode(text, "utf-8"); } catch (UnsupportedEncodingException e) { // TODO Auto-generated catch block e.printStackTrace();; } return null; }
Я передаю URL
http://www.example.com/handlepayment.php?signature=....&data=.... public String getXmlFromUrl(String url) { String xml = null; try { // defaultHttpClient DefaultHttpClient httpClient = new MyHttpClient_ALKS(myContext.getApplicationContext()); HttpPost httpPost = new HttpPost(url); HttpResponse httpResponse = httpClient.execute(httpPost); HttpEntity httpEntity = httpResponse.getEntity(); xml = EntityUtils.toString(httpEntity); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } catch (ClientProtocolException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } return xml; }
к серверу:
function verify_play($signed_data, $signature) { global $public_key_base64; $pkey = "-----BEGIN PUBLIC KEY-----\n". chunk_split($public_key_base64, 64,"\n"). '-----END PUBLIC KEY-----'; //using PHP to create an RSA key $pkey = openssl_get_publickey($pkey); //$signature should be in binary format, but it comes as BASE64. //So, I'll convert it. $signature = base64_decode($signature); //using PHP's native support to verify the signature $result = openssl_verify( $signed_data, $signature, $pkey, OPENSSL_ALGO_SHA1); if (0 === $result) { return false; } else if (1 !== $result) { return false; } else { return true; } } ;
Кажется, он всегда возвращает false ($ result = 0), кто-нибудь может понять, почему? Как передать незашифрованную подпись или какую кодировку использовать?