Albert_CaiCai
初来乍到
串个门
加好友
打招呼
发消息
| 电梯直达
楼主
发表于 2014-7-4 00:07:23 |只看该作者 |倒序浏览
本帖最后由 Albert_CaiCai 于 2014-7-4 00:07 编辑
苹果IAP二次验证流程为:
一:客户端(iphone or ipad)向Apple SERVER发送购买请求
二:AppleSERVER返回购买成功的receipt(IAP在购买流程中,会给每一次购买行为创建一个SKPaymentTransaction.
这个transaction会记录用户购买状态,其中transaction_id具有唯一性,transaction标识状态如:
正在购买(SKPaymentTransactionStatePurchasing)
已购买(SKPaymentTransactionStatePurchased)
购买失败(SKPaymentTransactionStateFailed)
而当transaction状态是SKPaymentTransactionStatePurchased(已购买)的时候,客户端就能得到一个transaction.transactionReceipt。
重点:此状态需要注意,进行IAP验证时,需要获取此回发信息用于第三方二次验证。
三、当客户端购买状态结束,收到经由苹果回发的Receipt是,获取客户端Receipt,经第三方平台进行二次验证,此时苹果服务器需要的数据格式为JSON,具体包含字段,由程序自行规定:例如:
quantity(数量)
product_id(物品ID)
transaction_id(交易标识,此字段可做全局标识,唯一)
purchase_date(交易日期)
数据转换为Json编码格式,键名为"receipt-data",值为上一步编码后的数据。具体格式为:
JavaScript代码
{
"receipt-data": "(编码后的数据)"
}
四、将此Json 经HTTPS POST的请求,将数据发送到App Store,其地址为:
https://buy.itunes.apple.com/verifyReceipt (正式购买地址)
https://sandbox.itunes.apple.com/verifyReceipt (测试数据地址)
五、App Store的返回值也是一个JSON格式的对象,包含两个键值对, status和receipt:
JavaScript代码
{
"status": 0,(验证状态码,0标识通过,21007 标识此数据为测试数据,需交由sandbox进行再次验证)
"receipt": {提交的数据解析为明文返回}
}
下面为具体代码实现方式,作为参考,各位如认为可用,欢迎使用:
Java代码
/**
*
*@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();
}
}
|
|
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理