一:客户端(iphone or ipad)向Apple SERVER发送购买请求
二:AppleSERVER返回购买成功的receipt(IAP在购买流程中,会给每一次购买行为创建一个SKPaymentTransaction,这个transaction会记录用户购买状态,如:
正在购买(SKPaymentTransactionStatePurchasing),
已购买(SKPaymentTransactionStatePurchased),
购买失败(SKPaymentTransactionStateFailed)。
而当transaction状态是 SKPaymentTransactionStatePurchased的时候,客户端就能得到一个transaction.transactionReceipt)
{
"receipt-data"
: "(编码后的数据)"
}
四、将此Json 经HTTP POST的请求,将数据发送到App Store,其地址为:
https://buy.itunes.apple.com/verifyReceipt (正式购买地址)
https://sandbox.itunes.apple.com/verifyReceipt (测试数据地址)
五、App Store的返回值也是一个JSON格式的对象,包含两个键值对, status和receipt:
{
"status"
: 0, (验证状态码,0标识通过,21007 标识此数据为测试数据,需交由sandbox进行再次验证)
"receipt"
: {提交的数据解析为明文返回}
}
下面为具体代码实现方式,作为参考,各位如认为可用,欢迎使用:/**
*
*@PackageName service
*@FileName IapSecondaryVerifyService.java
*@Author Albert
*@Time 2014-4-28下午2:04:39
*@Description IAP二次验证
*/
@Service("iapSecondaryVerifyService")
public class IapSecondaryVerifyService {
private final Logger LOGGER = Logger.getLogger(IapSecondaryVerifyService.class);
Map verifyResultMap = new HashMap();
String result = "";
String returnresult="";
String verifyStatus=null;
//所有的验证都进入这个方法
public synchronized Map getSecondaryVerify(String requestJson) throws Exception{
if(requestJson != "" || requestJson !=null){
URL dataUrl = new URL("https://buy.itunes.apple.com/verifyReceipt");
HttpURLConnection con = (HttpURLConnection) dataUrl.openConnection();
//设置请求头信息
con.setRequestMethod("POST");
con.setRequestProperty("content-type", "text/json");
con.setRequestProperty("Proxy-Connection", "Keep-Alive");
con.setDoOutput(true);
con.setDoInput(true);
OutputStreamWriter out =new OutputStreamWriter(con.getOutputStream());
String str= String.format(Locale.CHINA,"{\"receipt-data\":\""+requestJson+"\"}");
LOGGER.info(str);
out.write(str);
out.flush();
out.close();
InputStream is = con.getInputStream();
BufferedReader reader=new BufferedReader(new InputStreamReader(is));
String line = null;
while((line = reader.readLine()) != null){
result+= line+"\r\n";
}
org.json.JSONObject j;
try{
j = new org.json.JSONObject(result);
returnresult = j.get("status").toString();
if(returnresult.equals("0")){
verifyResultMap.put("verfyStatus", 0);
verifyResultMap.put("receipt", j.get("receipt"));
}else if(returnresult.equals("21007")){
sandboxUrl(requestJson);
}else if(returnresult.equals("21002")){
verifyResultMap.put("verfyStatus",-6L);
verifyResultMap.put("receipt", j.get("receipt"));
}
else{
verifyResultMap.put("verfyStatus", Long.valueOf(returnresult));
verifyResultMap.put("receipt", j.get("receipt"));
}
}catch(Exception e){
LOGGER.info("接收返回类型:"+e.getMessage());
}
}
return verifyResultMap;
}
public void sandboxUrl(String requestJson) {
try {
URL dataUrl = new URL("https://sandbox.itunes.apple.com/verifyReceipt");
HttpURLConnection con = (HttpURLConnection) dataUrl.openConnection();
con.setRequestMethod("POST");
con.setRequestProperty("content-type", "text/json");
con.setRequestProperty("Proxy-Connection", "Keep-Alive");
//con.setRequestProperty("receipt-data", receipt);
con.setDoOutput(true);
con.setDoInput(true);
OutputStreamWriter out =new OutputStreamWriter(con.getOutputStream());
String str2= String.format(Locale.CHINA,"{\"receipt-data\":\""+requestJson+"\"}");
out.write(str2);
out.flush();
out.close();
InputStream is = con.getInputStream();
BufferedReader reader=new BufferedReader(new InputStreamReader(is));
String line = null;
while((line = reader.readLine()) != null){
result+= line+"\r\n";
}
org.json.JSONObject j;
j = new org.json.JSONObject(result);
returnresult = j.get("status").toString();
if(returnresult.equals("0")){
verifyResultMap.put("verfyStatus", 0);
verifyResultMap.put("receipt", j.get("receipt"));
}else{
verifyResultMap.put("verfyStatus", Long.valueOf(returnresult));
verifyResultMap.put("receipt", null);
}
} catch (MalformedURLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (JSONException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}