这是一个手机端支付,server端提供支持,是通过手机端支付,把userId, price传入到paypal的一连接中去,(这个连接包括一个跳转到服务器的servlet)。我是做server端的,所以说一下server端的处理。
因为学习过Paypal支付的一些资料,所以知道paypal在请求我这个servlet时会传一个"memo"的参数。这个参数放的是“userId/priceId/random”这其是手机端传递过来放入其中的,我只要知道他的顺序就可以了,然后把他取出保存到数据库中。具体代码如下。首先说一下如果不知道对方请求过来的东西是什么可以用以下的代码来测试:
//test paypal feed url log
BufferedInputStream bis = new BufferedInputStream(req.getInputStream());
DataInputStream dis = new DataInputStream(bis);
ByteArrayOutputStream buffer = new ByteArrayOutputStream();
byte[] packet = new byte[1024];
int numBytesRead = 0;
while ((numBytesRead = dis.read(packet)) != -1)
buffer.write(packet, 0, numBytesRead);
byte[] arr = buffer.toByteArray();
String text = null;
try {
text = new String(arr, ENCODE);
} catch (UnsupportedEncodingException e) {
text = new String(arr);
}
log.info("in PaypalFeed----" + text);//这里可以得出paypal传送过来的到底是什么东西。
bis.close();
dis.close();
}
catch(Exception ex) {
ex.printStackTrace();
}
当知道它传递过来的东西时,可以通过以下代码来进行其他逻辑的处理:
String memo = req.getParameter("memo");
System.out.println("memo==>" + memo);
List<String> memoparam = MobileObjectConfigUtil.getMemoParam(memo);
if(memoparam != null && memoparam.size()> 0) {
userId = memoparam.get(0);
if(memoparam.get(1) != null) {
priceId = memoparam.get(1);
}
if(memoparam.get(2) != null) {
randomId = memoparam.get(2);
}
}
PaymentInforService paymentInforService = (PaymentInforService) Application.lookupBean(PaymentInforServiceImpl.BEAN_NAME);
if(StringUtil.isNotBlank(userId) && StringUtil.isNotBlank(priceId) && StringUtil.isNotBlank(randomId)) {
PaymentInfor payInfor = paymentInforService.getPaymentByMemo(userId, priceId, randomId);
if(payInfor == null) {
//把支付信息做保存
PaymentInfor paymentInfor = new PaymentInfor();
paymentInfor.setUser((SapUser) paymentInforService.get(SapUser.class,Long.valueOf(userId)));
paymentInfor.setCreditPrice((CreditPackage)paymentInforService.get(CreditPackage.class, Long.valueOf(priceId)));
paymentInfor.setRandomId(randomId);
paymentInfor.setDatetimeAdd(Calendar.getInstance().getTime());
paymentInforService.save(paymentInfor);
//add credit(处理逻辑的部分)
CreditPackage creditPackage = paymentInfor.getCreditPrice();
Credit credit = paymentInforService.findByUserId(userId);
if(credit != null) {
credit.setTotalCredit(Double.valueOf(credit.getTotalCredit() + creditPackage.getCredits()));
paymentInforService.update(credit);
}
}
}
补充MobileObjectConfigUtil.getMemoParam(memo)这个方法的详细代码
public static List<String> getMemoParam(String memoStr) {
List<String> resultList = new ArrayList<String>();
if (memoStr != null && !"".equalsIgnoreCase(memoStr)) {
if (memoStr.contains("/")) {
String[] str = memoStr.split("/");
for(int i=0; i<str.length ; i++) {
resultList.add(str[i]);
}
} else {
resultList.add(memoStr);
}
}
return resultList;
}
以上是paypal请求我们的servlet,那么怎么知道是否请求成功,就需要手机端不停的轮回请求server端的一个接口,去查询这条数据是不是在数据库,记得不,我们上面保存的数据都是手机端传过来的,所以他知道自己传的什么数据(userId,priceId, randomId),安照这三个参数在paymentInfor这个表里进行查询,如果有这条记录,表示已经请求成功。
也许对大家来说比较简单,但是知道了才感觉简单,之前我是没有感觉到有这样简单的,所以把它写下来了。