流程
后台需要为app提供服务,在ios中,app内进行支付购买时需要进行二次验证
用户进入购买虚拟物品页面,App从后台服务器获取产品列表然后显示给用户
用户点击购买购买某一个虚拟物品,APP就发送该虚拟物品的productionIdentifier到Apple服务器
Apple服务器根据APP发送过来的productionIdentifier返回相应的物品的信息(描述,价格等)
用户点击确认键购买该物品,购买请求发送到Apple服务器
Apple服务器完成购买后,返回用户一个完成购买的凭证
APP发送这个凭证到后台服务器验证
后台服务器把这个凭证发送到Apple验证,Apple返回一个字段给后台服务器表明该凭证是否有效
后台服务器把验证结果在发送到APP,APP根据验证结果做相应的处理

1.需要一个申请苹果开发者账号
2.绑定银行卡



设置完成以后
3.建一个沙箱测试号





Java端 服务器二次验证实现,下面是实现代码
public class ApplePey {
public static final ApplePey ME = new ApplePey();
private ApplePey() {
}
//购买凭证验证地址
private static final String VERIFY_ADDRESS = "https://buy.itunes.apple.com/verifyReceipt";
//测试的购买凭证验证地址
private static final String VERIFY_ADDRESS_TEST = "https://sandbox.itunes.apple.com/verifyReceipt";
/**
* 重写X509TrustManager
*/
private static TrustManager myX509TrustManager = new X509TrustManager() {
@Override
public X509Certificate[] getAcceptedIssuers() {
return null;
}
@Override
public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException {
}
@Override
public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException {
}
};
/**
* 接收iOS端发过来的购买凭证
* create time 2016年11月19日 下午5:33:39
*
* @param receipt 收据凭证
* @param address 地址
* @return Str 苹果返回的订单信息
*/
public String iapCertificate(String receipt) {
boolean address = false;
if (StringUtils.isEmpty(receipt)) {
return null;
}
String url = null;
// 获得测试地址
url = address == true ? VERIFY_ADDRESS : VERIFY_ADDRESS_TEST;
final String certificateCode = receipt;
if (StringUtils.isNotEmpty(certificateCode)) {
return sendHttpsCoon(url, certificateCode);
} else {
return null;
}
}
/**
* 发送请求
* create time 2016年11月19日 下午5:32:09
*
* @param url 地址
* @param certificateCode 需要验证订单
* @return Str 订单信息
*/
private String sendHttpsCoon(String url, String certificateCode) {
if (url.isEmpty()) {
return null;
}
try {
// 设置SSLContext
SSLContext ssl = SSLContext.getInstance("SSL");
ssl.init(null, new TrustManager[] {myX509TrustManager}, null);
// 打开连接
HttpsURLConnection conn = (HttpsURLConnection) new URL(url).openConnection();
// 设置套接工厂
conn.setSSLSocketFactory(ssl.getSocketFactory());
// 加入数据
conn.setRequestMethod("POST");
conn.setDoOutput(true);
conn.setRequestProperty("Content-type", "application/json");
// 设置Josn格式
JSONObject obj = new JSONObject();
obj.put("receipt-data", certificateCode);
BufferedOutputStream buffOutStr = new BufferedOutputStream(conn.getOutputStream());
buffOutStr.write(obj.toString().getBytes());
buffOutStr.flush();
buffOutStr.close();
// 获取输入流
BufferedReader reader = new BufferedReader(new InputStreamReader(conn.getInputStream()));
String line = null;
StringBuffer stringBuffer = new StringBuffer();
while ((line = reader.readLine()) != null) {
stringBuffer.append(line);
}
return stringBuffer.toString();
} catch (Exception e) {
return null;
}
}