Merge branch 'ofeiQB' into develop

master
wangning 7 years ago
commit e322e6a631

@ -13,6 +13,8 @@ public class PhoneTopUpQuery {
private String phone; private String phone;
private String type;
private int page = 1; private int page = 1;
private int limit = 10; private int limit = 10;
@ -57,11 +59,20 @@ public class PhoneTopUpQuery {
this.phone = phone; this.phone = phone;
} }
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
public JSONObject toParam(){ public JSONObject toParam(){
JSONObject param = new JSONObject(); JSONObject param = new JSONObject();
param.put("status",this.status); param.put("status",this.status);
param.put("amount",this.amount); param.put("amount",this.amount);
param.put("customer_number",this.phone); param.put("customer_number",this.phone);
param.put("type",this.type);
return param; return param;
} }
} }

@ -17,4 +17,7 @@ public interface OfeiClient {
void checkFlow(String phoneNumber, String flowValue, String perValue); void checkFlow(String phoneNumber, String flowValue, String perValue);
Element checkOrderStatus(String orderId); Element checkOrderStatus(String orderId);
void qbTopUp(String price, String qqNumber);
} }

@ -12,4 +12,7 @@ public interface OfeiServer {
void phoneTopUp(String price, boolean quickTopUp, String topUpDelayTime, String phoneNumber); void phoneTopUp(String price, boolean quickTopUp, String topUpDelayTime, String phoneNumber);
void qbTopUp(String price, String phoneNumber);
} }

@ -4,7 +4,9 @@ import java.io.IOException;
import java.net.URISyntaxException; import java.net.URISyntaxException;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Date; import java.util.Date;
import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map;
import javax.annotation.Resource; import javax.annotation.Resource;
@ -27,6 +29,7 @@ import com.alibaba.fastjson.JSONObject;
import au.com.royalpay.payment.core.exceptions.ChannelNetworkException; import au.com.royalpay.payment.core.exceptions.ChannelNetworkException;
import au.com.royalpay.payment.manage.mappers.ofei.TopUpOrderMapper; import au.com.royalpay.payment.manage.mappers.ofei.TopUpOrderMapper;
import au.com.royalpay.payment.manage.ofei.core.OfeiClient; import au.com.royalpay.payment.manage.ofei.core.OfeiClient;
import au.com.royalpay.payment.manage.ofei.enums.OfeiType;
import au.com.royalpay.payment.tools.codec.MD5Hash; import au.com.royalpay.payment.tools.codec.MD5Hash;
import au.com.royalpay.payment.tools.exceptions.BadRequestException; import au.com.royalpay.payment.tools.exceptions.BadRequestException;
import au.com.royalpay.payment.tools.exceptions.ServerErrorException; import au.com.royalpay.payment.tools.exceptions.ServerErrorException;
@ -55,6 +58,14 @@ public class OfeiClientImpl implements OfeiClient {
private final String flowTopUPUrl = "http://api2.ofpay.com/flowOrder.do"; private final String flowTopUPUrl = "http://api2.ofpay.com/flowOrder.do";
private final String checkFlowUrl = "http://api2.ofpay.com/flowCheck.do"; private final String checkFlowUrl = "http://api2.ofpay.com/flowCheck.do";
private final String checkOrderUrl = "http://api2.ofpay.com/queryOrderInfo.do"; private final String checkOrderUrl = "http://api2.ofpay.com/queryOrderInfo.do";
private final String qbTopUpUrl = "http://api2.ofpay.com/onlineorder.do";
private static final Map<String,String> qbCardId = new HashMap<>();
static {
qbCardId.put("10","220615");
qbCardId.put("30","220617");
qbCardId.put("50","220698");
qbCardId.put("100","220699");
}
@Override @Override
public void phoneTopUp(String price, boolean quickTopUp, String topUpDelayTime, String phoneNumber) { public void phoneTopUp(String price, boolean quickTopUp, String topUpDelayTime, String phoneNumber) {
@ -75,13 +86,13 @@ public class OfeiClientImpl implements OfeiClient {
params.add(new BasicNameValuePair("game_userid", phoneNumber)); params.add(new BasicNameValuePair("game_userid", phoneNumber));
params.add(new BasicNameValuePair("ret_url", "https://mpay.royalpay.com.au/ofei/notice/"+orderId)); params.add(new BasicNameValuePair("ret_url", "https://mpay.royalpay.com.au/ofei/notice/"+orderId));
saveOrder(orderId, now, "1", price, phoneNumber); saveOrder(orderId, now, OfeiType.PHONE.getMask(), price, phoneNumber);
HttpRequestGenerator req = initRequest(topUPUrl, signAndEncryptForm(params), RequestMethod.GET); HttpRequestGenerator req = initRequest(topUPUrl, signAndEncryptForm(params), RequestMethod.GET);
Element respXml = executeRequestXML(req, "ofei phone top up fail"); Element respXml = executeRequestXML(req, "ofei phone top up fail");
handleResponse(orderId, respXml,phoneNumber); handleResponse(orderId, respXml,phoneNumber);
} }
private void handleResponse(String orderId, Element respXml,String phoneNumber) { private void handleResponse(String orderId, Element respXml,String customerNumber) {
JSONObject detail = new JSONObject(); JSONObject detail = new JSONObject();
if ("1".equals(respXml.elementText("retcode"))) { if ("1".equals(respXml.elementText("retcode"))) {
detail.put("cardname", respXml.elementText("cardname")); detail.put("cardname", respXml.elementText("cardname"));
@ -103,7 +114,7 @@ public class OfeiClientImpl implements OfeiClient {
}else { }else {
detail.put("err_msg",respXml.elementText("err_msg")); detail.put("err_msg",respXml.elementText("err_msg"));
updateOrder(orderId,"99",detail); updateOrder(orderId,"99",detail);
logger.debug("phone->"+phoneNumber+" top up error orderId->"+orderId); logger.debug("Customer NUmber->"+customerNumber+" top up error orderId->"+orderId);
throw new ServerErrorException("System error"); throw new ServerErrorException("System error");
} }
} }
@ -145,7 +156,7 @@ public class OfeiClientImpl implements OfeiClient {
params.add(new BasicNameValuePair("effectTime", "1")); params.add(new BasicNameValuePair("effectTime", "1"));
params.add(new BasicNameValuePair("netType", "4G")); params.add(new BasicNameValuePair("netType", "4G"));
params.add(new BasicNameValuePair("sporderId", orderId)); params.add(new BasicNameValuePair("sporderId", orderId));
saveOrder(orderId, new Date(), "2", perValue, phoneNumber); saveOrder(orderId, new Date(), OfeiType.FLOW.getMask(), perValue, phoneNumber);
HttpRequestGenerator req = initRequest(flowTopUPUrl, signAndEncryptForm(params), RequestMethod.GET); HttpRequestGenerator req = initRequest(flowTopUPUrl, signAndEncryptForm(params), RequestMethod.GET);
Element respXml = executeRequestXML(req, "ofei flowTopUp"); Element respXml = executeRequestXML(req, "ofei flowTopUp");
handleResponse(orderId, respXml,phoneNumber); handleResponse(orderId, respXml,phoneNumber);
@ -188,6 +199,35 @@ public class OfeiClientImpl implements OfeiClient {
return executeRequestXML(req,"ofei check order status error"); return executeRequestXML(req,"ofei check order status error");
} }
@Override
public void qbTopUp(String price, String qqNumber) {
if(price.contains(".")){
throw new BadRequestException("Invalid Price");
}
String orderId = "ofei-" + DateFormatUtils.format(new Date(), "yyyyMMddHHmmss") + "-" + RandomStringUtils.random(5, true, true);
List<NameValuePair> params = new ArrayList<>();
String md5Pwd = MD5Hash.hashToHex(pwd);
Date now = new Date();
params.add(new BasicNameValuePair("userid", spCode));
params.add(new BasicNameValuePair("userpws", md5Pwd));
if(qbCardId.containsKey(price)){
params.add(new BasicNameValuePair("cardid", qbCardId.get(price)));
params.add(new BasicNameValuePair("cardnum", "1"));
}else {
params.add(new BasicNameValuePair("cardid", "220612"));
params.add(new BasicNameValuePair("cardnum", price));
}
params.add(new BasicNameValuePair("sporder_id", orderId));
params.add(new BasicNameValuePair("sporder_time", DateFormatUtils.format(now, "yyyyMMddHHmmss")));
params.add(new BasicNameValuePair("game_userid", qqNumber));
params.add(new BasicNameValuePair("ret_url", "https://mpay.royalpay.com.au/ofei/notice/"+orderId));
saveOrder(orderId, now, OfeiType.QB.getMask(), price, qqNumber);
HttpRequestGenerator req = initRequest(qbTopUpUrl, signAndEncryptForm(params), RequestMethod.POST);
Element respXml = executeRequestXML(req, "ofei QB top up fail");
handleResponse(orderId, respXml,qqNumber);
}
private List<NameValuePair> signAndEncryptForm(List<NameValuePair> params) { private List<NameValuePair> signAndEncryptForm(List<NameValuePair> params) {
String signStr = ""; String signStr = "";
for (NameValuePair pair : params) { for (NameValuePair pair : params) {

@ -94,4 +94,16 @@ public class OfeiServceImpl implements OfeiServer {
stringRedisTemplate.boundValueOps(reidsCheckCodeKey).set(bindId, 10, TimeUnit.MINUTES); stringRedisTemplate.boundValueOps(reidsCheckCodeKey).set(bindId, 10, TimeUnit.MINUTES);
} }
@Override
public void qbTopUp(String price, String qqNumber) {
String reidsCheckCodeKey = "qbtopup"+qqNumber;
String value = stringRedisTemplate.boundValueOps(reidsCheckCodeKey).get();
if (!StringUtils.isEmpty(value)) {
throw new ForbiddenException("A phone number can only be recharged in 10 minutes");
}
ofeiClient.qbTopUp(price,qqNumber);
String bindId = RandomStringUtils.random(6, false, true);
stringRedisTemplate.boundValueOps(reidsCheckCodeKey).set(bindId, 10, TimeUnit.MINUTES);
}
} }

@ -0,0 +1,21 @@
package au.com.royalpay.payment.manage.ofei.enums;
/**
* Created by wangning on 30/01/2018.
*/
public enum OfeiType {
PHONE("1"), // 话费
FLOW("2"), // 流量
QB("3");// Q币
private String mask;
OfeiType(String mask) {
this.mask = mask;
}
public String getMask() {
return mask;
}
}

@ -3,6 +3,7 @@ package au.com.royalpay.payment.manage.ofei.web;
import au.com.royalpay.payment.manage.ofei.bean.PhoneTopUpQuery; import au.com.royalpay.payment.manage.ofei.bean.PhoneTopUpQuery;
import au.com.royalpay.payment.manage.ofei.core.OfeiServer; import au.com.royalpay.payment.manage.ofei.core.OfeiServer;
import au.com.royalpay.payment.manage.ofei.core.PhoneTopUpService; import au.com.royalpay.payment.manage.ofei.core.PhoneTopUpService;
import au.com.royalpay.payment.tools.exceptions.BadRequestException;
import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.JSONObject;
@ -17,7 +18,7 @@ import javax.annotation.Resource;
* Created by wangning on 2017/12/8. * Created by wangning on 2017/12/8.
*/ */
@RestController @RestController
@RequestMapping("/phone_top_up") @RequestMapping("/top_up")
public class PhoneTopUpController { public class PhoneTopUpController {
@Resource @Resource
private OfeiServer ofeiServer; private OfeiServer ofeiServer;
@ -25,8 +26,17 @@ public class PhoneTopUpController {
private PhoneTopUpService phoneTopUpService; private PhoneTopUpService phoneTopUpService;
@RequestMapping(value = "/recharge", method = { RequestMethod.GET, RequestMethod.POST }) @RequestMapping(value = "/recharge", method = { RequestMethod.GET, RequestMethod.POST })
public void recharge(@RequestParam String phoneNumber, @RequestParam String amount) { public void recharge(@RequestParam String customerNumber, @RequestParam String amount, @RequestParam(defaultValue = "1") String type) {
ofeiServer.phoneTopUp(amount,true,null,phoneNumber); switch (type) {
case "1":
ofeiServer.phoneTopUp(amount, true, null, customerNumber);
break;
case "3":
ofeiServer.qbTopUp(amount, customerNumber);
break;
default:
throw new BadRequestException("unknow top up type");
}
} }
@RequestMapping(value = "/list", method = { RequestMethod.GET, RequestMethod.GET }) @RequestMapping(value = "/list", method = { RequestMethod.GET, RequestMethod.GET })

@ -22,6 +22,9 @@
<if test="amount > 0"> <if test="amount > 0">
amount = #{amount} amount = #{amount}
</if> </if>
<if test="type != null">
`type` = #{type}
</if>
</where> </where>
</select> </select>
</mapper> </mapper>

@ -44,12 +44,12 @@ define(['angular', 'uiRouter', 'static/commons/angular-ueditor'], function (angu
app.controller('cmsRootCtrl', ['$scope', function ($scope) { app.controller('cmsRootCtrl', ['$scope', function ($scope) {
}]); }]);
app.controller('CmsPhonetopupCtrl', ['$scope', '$http', '$filter', function ($scope, $http, $filter) { app.controller('CmsPhonetopupCtrl', ['$scope', '$http', function ($scope, $http) {
$scope.queryParams = {}; $scope.queryParams = {};
$scope.pagination = {}; $scope.pagination = {};
$scope.topUp = function () { $scope.topUp = function () {
var params = angular.copy($scope.params); var params = angular.copy($scope.params);
$http.get('/phone_top_up/recharge',{params: params}).then(function (resp) { $http.get('/top_up/recharge',{params: params}).then(function (resp) {
alert('ok'); alert('ok');
}, function (resp) { }, function (resp) {
alert(resp.data.message); alert(resp.data.message);
@ -68,7 +68,10 @@ define(['angular', 'uiRouter', 'static/commons/angular-ueditor'], function (angu
if(params.status==''|| params.status==null){ if(params.status==''|| params.status==null){
delete params.status; delete params.status;
} }
$http.get('/phone_top_up/list',{params: params}).then(function (resp) { if(params.type==''|| params.type==null){
delete params.type;
}
$http.get('/top_up/list',{params: params}).then(function (resp) {
$scope.orders = resp.data.data; $scope.orders = resp.data.data;
$scope.pagination = resp.data.pagination; $scope.pagination = resp.data.pagination;
}) })
@ -133,6 +136,8 @@ define(['angular', 'uiRouter', 'static/commons/angular-ueditor'], function (angu
return '话费充值'; return '话费充值';
case '2': case '2':
return '流量'; return '流量';
case '3':
return 'QB';
} }
} }
}); });

@ -17,8 +17,24 @@
<div class="box-header"> <div class="box-header">
<form role="form" style="margin:0px auto;width: 50%"> <form role="form" style="margin:0px auto;width: 50%">
<div class="form-group"> <div class="form-group">
<label>Phone Number</label> <label>Type</label>
<input ng-model="params.phoneNumber" name="code" <select class="form-control" name="industry"
ng-model="params.type"
id="industry-input" required>
<option value="">Please Choose</option>
<option value="1">Phone</option>
<option value="2">Flow</option>
<option value="3">QB</option>
</select>
<div ng-messages="params.type.$error"
ng-if="params.type.$dirty">
<p class="small text-danger" ng-message="required">Required
Field</p>
</div>
</div>
<div class="form-group">
<label>Customer Number</label>
<input ng-model="params.customerNumber" name="code"
class="form-control" type="text"/> class="form-control" type="text"/>
</div> </div>
<div class="form-group"> <div class="form-group">
@ -55,13 +71,27 @@
<a role="button" ng-class="{'bg-primary':queryParams.status=='30'}" <a role="button" ng-class="{'bg-primary':queryParams.status=='30'}"
ng-click="queryParams.status='30';listTopUpOrders(1)">Refund</a> | ng-click="queryParams.status='30';listTopUpOrders(1)">Refund</a> |
<a role="button" ng-class="{'bg-primary':queryParams.status=='20'}" <a role="button" ng-class="{'bg-primary':queryParams.status=='20'}"
ng-click="queryParams.status='20';listTopUpOrders(1)">fail</a> | ng-click="queryParams.status='20';listTopUpOrders(1)">Fail</a> |
<a role="button" ng-class="{'bg-primary':queryParams.status=='99'}" <a role="button" ng-class="{'bg-primary':queryParams.status=='99'}"
ng-click="queryParams.status='99';listTopUpOrders(1)">Error</a> ng-click="queryParams.status='99';listTopUpOrders(1)">Error</a>
</p> </p>
</div> </div>
</div> </div>
<div class="form-group col-xs-12">
<label class="control-label col-xs-4 col-sm-2">Type</label>
<div class="col-sm-10 col-xs-8">
<p class="form-control-static">
<a role="button" ng-class="{'bg-primary':queryParams.type==null}"
ng-click="queryParams.type='';listTopUpOrders(1)">All</a> |
<a role="button" ng-class="{'bg-primary':queryParams.type=='1'}"
ng-click="queryParams.type='1';listTopUpOrders(1)">Phone</a> |
<a role="button" ng-class="{'bg-primary':queryParams.type=='2'}"
ng-click="queryParams.type='2';listTopUpOrders(1)">Flow</a> |
<a role="button" ng-class="{'bg-primary':queryParams.type=='3'}"
ng-click="queryParams.type='3';listTopUpOrders(1)">QB</a>
</p>
</div>
</div>
<div class="form-group col-xs-12"> <div class="form-group col-xs-12">
<label class="control-label col-xs-4 col-sm-2">Amount</label> <label class="control-label col-xs-4 col-sm-2">Amount</label>
<div class="col-sm-10 col-xs-8"> <div class="col-sm-10 col-xs-8">

@ -229,7 +229,7 @@ define(['angular', 'uiRouter', 'uiBootstrap'], function (angular) {
app.controller('phonetopupCtrl', ['$scope', '$http', '$filter', function ($scope, $http, $filter) { app.controller('phonetopupCtrl', ['$scope', '$http', '$filter', function ($scope, $http, $filter) {
$scope.topUp = function () { $scope.topUp = function () {
var params = angular.copy($scope.params); var params = angular.copy($scope.params);
$http.get('/phone_top_up/recharge',{params: params}).then(function (resp) { $http.get('/top_up/recharge',{params: params}).then(function (resp) {
alert('ok'); alert('ok');
}, function (resp) { }, function (resp) {
alert(resp.data.message); alert(resp.data.message);

@ -0,0 +1,27 @@
package au.com.royalpay.payment.manage.ofei.core.impl;
import au.com.royalpay.payment.manage.ofei.core.OfeiClient;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.ActiveProfiles;
import org.springframework.test.context.junit4.SpringRunner;
import javax.annotation.Resource;
/**
* Created by wangning on 30/01/2018.
*/
@SpringBootTest
@ActiveProfiles({ "local", "alipay", "wechat", "jd", "bestpay" })
@RunWith(SpringRunner.class)
public class OfeiClientImplTest {
@Resource
private OfeiClient ofeiClient;
@Test
public void qbTopUp() throws Exception {
ofeiClient.qbTopUp("10","164851225");
}
}
Loading…
Cancel
Save