編輯:關於Android編程
一.開發前准備
https://doc.open.alipay.com/doc2/detail.htm?spm=0.0.0.0.B6xA20&treeId=26&articleId=103239&docType=1
1.開通支付寶企業號
2.簽約認證
3.創建應用,審核通過。
4.上傳應用公鑰。
二.開發demo從支付寶官網下載
alipay-sdk-java-ALL20150604113758-source.jar
alipay-sdk-java-ALL20150604113758.jar
/**
* 調用支付寶掃碼支付二維碼生成
*
* @return
*/
public String aliQr() {
String orderId = httpServletRequest.getParameter("orderId");
String out_trade_no = getTradeNo();
String total_amount = httpServletRequest.getParameter("total_amount");
String subject = "";
String companyId = getCompanyInfo().getCompanyId();
Order o = null;
try {
o = orderService.getOrderById(Integer.parseInt(orderId));
subject = CommonCompanyName(o.getCompanyId(), o.getSubCompanyId())
+ "的商品" + total_amount + "元";
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
AlipayTradePrecreateResponse response = qrPay(out_trade_no,
total_amount, subject, companyId, orderId, o.getSubCompanyId());
if (null != response && response.isSuccess()) {
ResponseWriteUtil.writeHTML("{\"code\":\"" + response.getQrCode()
+ "\"," + "\"outTradeNo\":\"" + response.getOutTradeNo()
+ "\"}");
// 生成自定義二維碼圖片
// String path = "/qrcode/" + companyId + "/" + out_trade_no +
// ".png";
// String qrCodePath = ServletActionContext.getServletContext()
// .getRealPath(path);
// ZXingQrCode.createQrCodeImg(300, 300, response.getQrCode(),
// qrCodePath);
// 保存二維碼值
HashMap map = new HashMap();
map.put("orderId", orderId);
map.put("aliqrcodeUrl", response.getQrCode());
// map.put("aliqrcodeUrl", ConfigUtil.SYS_BASE_URL + path);
orderService.updateAliQrCodeByOrderId(map);
} else {
ResponseWriteUtil.writeHTML("{\"code\":\"0\"}");// 不存在
}
return null;
}
public String CommonCompanyName(String companyId, String subCompanyId) {
Seller seller = sellerService.findSellerByCompanyId(companyId);
String commonMsg = "";
SubCompany subCompany = null;
if (StringUtils.isNotBlank(subCompanyId)) {
subCompany = subCompanyService.fetchSubCompanyBySid(subCompanyId);
}
if (subCompany == null) {// 主店
commonMsg = seller.getCompanyName();
} else {// 分店
commonMsg = subCompany.getCompanyShortName();
}
return commonMsg;
}
/**
* 是否配置了支付寶二維碼支付
*
* @return
*/
public String isExistByAliPayQrCode() {
String companyId = httpServletRequest.getParameter("companyId");
String subCompanyId = httpServletRequest.getParameter("subCompanyId");
HashMap map2 = new HashMap();
map2.put("companyId", companyId);
map2.put("subCompanyId", subCompanyId);
ALIPayConfigure aliPayConfigure = aliPayConfigureService
.selectAppId(map2);
if (aliPayConfigure != null) {
ResponseWriteUtil.writeHTML("{\"code\":\"" + 1 + "\"}");
} else {
ResponseWriteUtil.writeHTML("{\"code\":\"" + 0 + "\"}");
}
return null;
}
/**
* 回調通知處理
*
* @return
*/
public String notifyMsgByAliPay() {
String orderId = httpServletRequest.getParameter("orderId");
String totalAmount = httpServletRequest.getParameter("totalAmount");
String outTradeNo = httpServletRequest.getParameter("outTradeNo");
System.out.println("訂單號:" + orderId + ",訂單金額:" + totalAmount
+ ",商戶交易號:" + outTradeNo);
System.out.println("支付寶異步回調通知:");
// 判斷付款是否成功,已成功則不再記錄付款信息
if (orderService.ifOrderPaid(Integer.parseInt(orderId)) > 0) {
log.info("付款已成功,不再記錄付款信息");
ResponseWriteUtil.writeHTML("success");
return null;
}
aliPayService.aliPayFinsh(Integer.parseInt(orderId), totalAmount,
outTradeNo);
System.out.println("系統訂單業務處理完成");
ResponseWriteUtil.writeHTML("success");// 告訴支付寶我已處理,不需要重復發異步通知
System.out.println("支付寶異步回調通知成功結束");
return null;
}
//*************start*********aliPayByQr******************************
//是否配置了支付寶掃碼
function isExistByAliPayQrCode(){
var companyId=$("#companyId").val();
var subCompanyId=$("#subCompanyId").val();
if(subCompanyId==null||subCompanyId=='null'||subCompanyId==undefined){
subCompanyId="";
}
$.ajax({
url : '<%=basePath%>/aliPay!isExistByAliPayQrCode.action?companyId='+companyId+'&subCompanyId='+subCompanyId,
async : false,
type : "post",
dataType : "json",
success : function(result) {
if(result.code!='0'){
$("#aliQrBtn").show();
}else{
$("#aliQrBtn").hide();
layer.msg("商家沒有配置支付寶掃碼支付!");
}
}
});
}
function aliQrClick(){
var total_amount=$("#paymentAmount").val();
var orderId=$("#myorderId").val();
//check
var paySize=$(".payMoneyC").length;
var ptypeNum=$(".ptype:checked").length;
var paySum=0;
if(ptypeNum<=0){
layer.msg("支付方式至少選擇一個!");
return;
}
if(ptypeNum!=1){
layer.msg("支付方式只能是支付寶掃碼支付!");
return;
}
var companyId=$("#companyId").val();
var subCompanyId=$("#subCompanyId").val();
if(subCompanyId==null||subCompanyId=='null'||subCompanyId==undefined){
subCompanyId="";
}
$.ajax({
url : '<%=basePath%>/aliPay!aliQr.action',
async : false,
type : "post",
dataType : "json",
data:{"total_amount":total_amount,"orderId":orderId},
success : function(result) {
if(result.code!='0'){
$("#aliQrBtn").hide();
$("#outputALIQr").show();
jQuery('#outputALIQr').qrcode({width:200,height:200,text:result.code});//js二維碼生成
window.setInterval(finshAliQrPay, 8000);
}else{
layer.msg("支付寶二維碼生成出錯!");
}
}
});
}
function qrQueryRetry(out_trade_no){
$.ajax({
url : '<%=basePath%>/aliPay!aliQueryRetry.action',
async : false,
type : "post",
dataType : "json",
data:{"out_trade_no":out_trade_no},
success : function(result) {
}
});
}
var aliNum=0;
function finshAliQrPay(){
var orderId=$("#myorderId").val();
$.ajax({
url : '<%=basePath%>/aliPay!notifyOrderCashFinshed.action?orderId='+orderId,
async : false,
type : "post",
dataType : "json",
data:$('#finishForm').serialize(),
success : function(result) {
if(result.code!='0'){
layer.msg("支付寶掃碼支付交易成功,訂單3秒後即將關閉!");
window.setTimeout(function(){
//關閉彈出窗之前,跳轉到其他頁面
parent.window.location.href="<%=path%>/"+result.redirectUrl;
closeLayerDialog();
},3000);
}else{
aliNum=aliNum+1;
$("#aliQrPayNotifyNum").val(aliNum);
}
}
});
}
//*************end*******aliPayByQr********************************
5.aliPayService 實現類
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import javax.annotation.Resource;
import org.apache.log4j.Logger;
import org.springframework.stereotype.Service;
import com.alipay.api.AlipayApiException;
import com.alipay.api.AlipayClient;
import com.alipay.api.DefaultAlipayClient;
import com.alipay.api.request.AlipayTradePrecreateRequest;
import com.alipay.api.request.AlipayTradeQueryRequest;
import com.alipay.api.request.AlipayTradeRefundRequest;
import com.alipay.api.response.AlipayTradePrecreateResponse;
import com.alipay.api.response.AlipayTradeQueryResponse;
import com.alipay.api.response.AlipayTradeRefundResponse;
@Service("aliPayService")
public class ALIPayServiceImpl implements ALIPayService {
Logger log = Logger.getLogger(ALIPayServiceImpl.class);
@Resource
private OrderDAO orderDAO;
@Resource
private SerialNumMngDAO serialNumMngDAO;
@Resource
private ALIPayTradeLogsDAO aliPayTradeLogsDAO;
@Resource
private ALIPayConfigureDAO aliPayConfigureDAO;
@Resource
private ALIPayTradeLogsService aliPayTradeLogsService;
@Resource
private ALIPayConfigureService aliPayConfigureService;
@Resource
private OrderService orderService;
@Override
public void aliPayFinsh(Integer orderId, String totalAmount,
String outTradeNo) {
// TODO Auto-generated method stub
Order o = null;
float paymentAmount = Float.parseFloat(totalAmount);
try {
o = orderDAO.getOrderbyId(orderId);
// 系統交易流水記錄
List ops = new ArrayList();
OrderPlus op = new OrderPlus();
op.setOrderId(o.getId());
op.setOrderAmount(o.getAmount());
op.setPaymentAmount(paymentAmount);
op.setPaymentTime(new Date());
op.setPaymentType(EnumUtil.PAYMENT_TYPE.alipayqrbycompay.getCode());
op.setNotes("支付寶掃碼支付:支付金額為" + paymentAmount);
ops.add(op);
orderDAO.insertOrderPlusPitch(ops);
// 更新系統訂單業務
HashMap map = new HashMap();
map.put("orderId", o.getId());
// 外賣
if (o.getIsTakeOut() == 1) {
map.put("dealSts", EnumUtil.ORDER_dealSts.finished.getCode());
} else {
map.put("dealSts", EnumUtil.ORDER_dealSts.paid.getCode());
}
map.put("finishTime", new Date());
map.put("paymentAmount", paymentAmount);
map.put("orderPersonNum", 0);
map.put("orderTime", o.getOrderTime());
serialNumMngDAO.finishOrder(map);
// 支付寶交易流水記錄
HashMap map2 = new HashMap();
map2.put("companyId", o.getCompanyId());
map2.put("subCompanyId", o.getSubCompanyId());
ALIPayConfigure alipc = aliPayConfigureDAO.selectAppId(map2);
ALIPayTradeLogs aliPaytl = new ALIPayTradeLogs();
aliPaytl.setOutTradeNo(outTradeNo);
if (alipc != null) {
aliPaytl.setAppId(alipc.getAppId());
}
aliPaytl.setOrderId(String.valueOf(orderId));
aliPaytl.setTotalAmount(paymentAmount);
aliPaytl.setChannel("ALI_OFFLINE_QRCODE");
aliPaytl.setTradeDate(new Date());
aliPayTradeLogsDAO.insert(aliPaytl);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
@Override
public HashMap refundOrderByALIQr(String orderId,
String refund_amount) {
// TODO Auto-generated method stub
HashMap map = new HashMap();
ALIPayTradeLogs ali = aliPayTradeLogsService.selectByOrderId(Integer
.parseInt(orderId));
if (ali != null) {
Order o = null;
try {
o = orderService.getOrderById(Integer.parseInt(orderId));
} catch (Exception e) {
e.printStackTrace();
}
HashMap queryMap = query(ali.getOutTradeNo(),
o.getCompanyId(), o.getSubCompanyId());
int flag = (Integer) queryMap.get("flag");
String tradeNo = (String) queryMap.get("tradeNo");
if (flag == 1) {
boolean refundFlag = refundOrder(tradeNo, refund_amount, "",
o.getCompanyId(), o.getSubCompanyId());
map.put("refundFlag", refundFlag);
map.put("refundMsg", "支付寶掃碼(企業)提示:該支付款按原路退到買家帳號,請注意查收!");
} else if (flag == 2) {
map.put("refundFlag", false);
map.put("refundMsg", "平台提示:支付寶掃碼等待付款");
} else if (flag == 3) {
map.put("refundFlag", false);
map.put("refundMsg", "平台提示:支付寶掃碼未付款關閉,或已付款的訂單全額退款後關閉");
} else if (flag == 4) {
map.put("refundFlag", false);
map.put("refundMsg", "平台提示:支付寶掃碼訂單不可退款或撤銷");
} else if (flag == 0) {
map.put("refundFlag", false);
map.put("refundMsg", "平台提示:支付寶掃碼請求未成功,請重試");
}
}
return map;
}
public HashMap query(final String out_trade_no,
String companyId, String subCompanyId) {
String tradeNo = "";
HashMap map = new HashMap();
AlipayClient alipayClient = getAlipayClientByCompanyId(companyId,
subCompanyId);
AlipayTradeQueryRequest request = new AlipayTradeQueryRequest();
String biz_content = "{\"out_trade_no\":\"" + out_trade_no + "\"}";
request.setBizContent(biz_content);
AlipayTradeQueryResponse response = null;
try {
response = alipayClient.execute(request);
System.out.println(response.getBody());
System.out.println(response.getCode());
if (null != response && response.isSuccess()) {
System.out.println("買家賬號:" + response.getBuyerLogonId());
System.out.println("商戶訂單號:" + response.getOutTradeNo());
System.out.println("支付寶交易號:" + response.getTradeNo());
System.out.println("總金額:" + response.getTotalAmount());
System.out.println("訂單狀態:" + response.getTradeStatus());
if (response.getCode().equals("10000")) {
tradeNo = response.getTradeNo();
if ("TRADE_SUCCESS".equalsIgnoreCase(response
.getTradeStatus())) {
map.put("tradeNo", tradeNo);
map.put("flag", 1);
// 表示已付款
} else if ("WAIT_BUYER_PAY".equalsIgnoreCase(response
.getTradeStatus())) {
map.put("tradeNo", tradeNo);
map.put("flag", 2);
// 表示等待付款
} else if ("TRADE_CLOSED".equalsIgnoreCase(response
.getTradeStatus())) {
map.put("tradeNo", tradeNo);
map.put("flag", 3);
// 表示未付款關閉,或已付款的訂單全額退款後關閉
} else if ("TRADE_FINISHED".equalsIgnoreCase(response
.getTradeStatus())) {
// 此狀態,訂單不可退款或撤銷
map.put("tradeNo", tradeNo);
map.put("flag", 4);
}
} else {
// 如果請求未成功,請重試
map.put("tradeNo", tradeNo);
map.put("flag", 0);
}
}
} catch (AlipayApiException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return map;
}
/**
* 申請退單
*
* @param trade_no
* @author jinlong.rhj
* @date 2015年4月27日
* @version 1.0
* @return
*/
public boolean refundOrder(String trade_no, String refund_amount,
String out_request_no, String companyId, String subCompanyId) {
boolean flag = false;
AlipayClient alipayClient = getAlipayClientByCompanyId(companyId,
subCompanyId);
AlipayTradeRefundRequest request = new AlipayTradeRefundRequest();
String biz_content = "{\"trade_no\":\""
+ trade_no
+ "\",\"refund_amount\":\""
+ refund_amount
+ "\",\"out_request_no\":\""
+ out_request_no
+ "\",\"refund_reason\":\"正常退單\",\"store_id\":\"\",\"terminal_id\":\"\"}";
System.out.println(biz_content);
request.setBizContent(biz_content);
AlipayTradeRefundResponse response = null;
try {
response = alipayClient.execute(request);
// System.out.println(response.getBody());
// System.out.println(response.getCode());
// System.out.println(response.getMsg());
// System.out.println(response.getSubCode());
// System.out.println(response.getSubMsg());
// System.out.println(response.getBuyerLogonId());
// System.out.println(response.getFundChange());
// System.out.println(response.getOpenId());
// System.out.println(response.getOutTradeNo());
// System.out.println(response.getRefundFee());
// System.out.println(response.getGmtRefundPay());
// System.out.println(response.getOpenId());
if (null != response && response.isSuccess()) {
if (response.getCode().equals("10000")) {
if (response.getFundChange().equals("Y")) {
// 退款成功,資金有變動,做業務及賬務處理
flag = true;
} else {
// 資金無變動,不必做賬務處理
}
} else {
// 沒有撤銷成功,需要重試幾次
// refundOrderRetry(trade_no, refund_amount, out_request_no,
// 6);
}
}
} catch (AlipayApiException e) {
e.printStackTrace();
}
return flag;
}
@Override
public AlipayClient getAlipayClientByCompanyId(String companyId,
String subCompanyId) {
HashMap map2 = new HashMap();
map2.put("companyId", companyId);
map2.put("subCompanyId", subCompanyId);
ALIPayConfigure aliPayConfigure = aliPayConfigureService
.selectAppId(map2);
DefaultAlipayClient alipayClient = null;
if (aliPayConfigure != null) {
alipayClient = new DefaultAlipayClient(
AlipayServiceEnvConstants.ALIPAY_GATEWAY,
aliPayConfigure.getAppId(),
aliPayConfigure.getPrivateKey(), "json",
AlipayServiceEnvConstants.CHARSET,
AlipayServiceEnvConstants.ALIPAY_PUBLIC_KEY);
}
return alipayClient;
}
/**
* 支付寶掃碼支付二維碼生成接口
*
* @param out_trade_no
* @param total_amount
* @param subject
* @param companyId
* @return
*/
public AlipayTradePrecreateResponse qrPay(String out_trade_no,
String total_amount, String subject, String companyId,
String orderId, String subCompanyId) {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String time_expire = sdf.format(System.currentTimeMillis() + 24 * 60
* 60 * 1000);
StringBuilder sb = new StringBuilder();
sb.append("{\"out_trade_no\":\"" + out_trade_no + "\",");
sb.append("\"total_amount\":\"" + total_amount
+ "\",\"discountable_amount\":\"0.00\",");
sb.append("\"subject\":\"" + subject + "\",");
sb.append("\"time_expire\":\"" + time_expire + "\"}");
System.out.println(sb.toString());
AlipayClient alipayClient = getAlipayClientByCompanyId(companyId,
subCompanyId);
// 使用SDK,構建群發請求模型
AlipayTradePrecreateRequest request = new AlipayTradePrecreateRequest();
request.setBizContent(sb.toString());
request.setNotifyUrl(ConfigUtil.SYS_BASE_URL
+ "/aliPay!notifyMsgByAliPay.action" + "?orderId=" + orderId
+ "&totalAmount=" + total_amount + "&outTradeNo="
+ out_trade_no);
AlipayTradePrecreateResponse response = null;
// 商家配置不成功
if (alipayClient == null) {
return response;
}
try {
// 使用SDK,調用交易下單接口
response = alipayClient.execute(request);
System.out.println(response.getBody());
System.out.println(response.isSuccess());
System.out.println(response.getMsg());
// 這裡只是簡單的打印,請開發者根據實際情況自行進行處理
if (null != response && response.isSuccess()) {
if (response.getCode().equals("10000")) {
System.out.println("商戶訂單號:" + response.getOutTradeNo());
System.out.println("二維碼值:" + response.getQrCode());// 商戶將此二維碼值生成二維碼,然後展示給用戶,用戶用支付寶手機錢包掃碼完成支付
// 二維碼的生成,網上有許多開源方法,可以參看:http://blog.csdn.net/feiyu84/article/details/9089497
} else {
// 打印錯誤碼
System.out.println("錯誤碼:" + response.getSubCode());
System.out.println("錯誤描述:" + response.getSubMsg());
}
}
} catch (AlipayApiException e) {
}
return response;
}
}
import java.util.HashMap;
import com.alipay.api.AlipayClient;
import com.alipay.api.response.AlipayTradePrecreateResponse;
public interface ALIPayService {
/**
* 支付寶掃碼支付成功後,訂單業務處理
*
* @param orderId
*/
public void aliPayFinsh(Integer orderId, String totalAmount,
String outTradeNo);
/**
* 支付寶掃碼支付申請退款業務處理
*
* @param orderId
* @param refund_amount
* @return
*/
public HashMap refundOrderByALIQr(String orderId, String refund_amount);
/**
* 各商家的獲得API調用客戶端
*
* @param companyId
* @param subCompanyId
* @return
*/
public AlipayClient getAlipayClientByCompanyId(String companyId,
String subCompanyId);
/**
* 支付寶掃碼支付二維碼生成接口
*
* @param out_trade_no
* @param total_amount
* @param subject
* @param companyId
* @return
*/
public AlipayTradePrecreateResponse qrPay(String out_trade_no,
String total_amount, String subject, String companyId,
String orderId, String subCompanyId);
}
Android 熱修復使用Gradle Plugin1.5改造Nuwa插件
隨著谷歌的Gradle插件版本的不斷升級,Gradle插件現在最新的已經到了2.1.0-beta1,對應的依賴為com.android.tools.build:gradl
Android Fragment學習
android Fragments詳解 Fragment是activity的界面中的一部分或一種行為。你可以把多個Fragment們組合到一個activity中
Jenkins 中運行Android lint和monkey
進入到相應job的配置頁面。Lint:1.在增加構建後操作中添加lint2.在高級中添加lint的通過標准monkey1.在跑monkey前需要將此次構建的apk包安裝到
Xamarin android如何調用百度地圖入門示例(一)
在Xamarin android如何調用百度地圖呢?首先我們要區分清楚,百度地圖這是一個廣泛的概念,很多剛剛接觸這個名詞”百度地圖api”,的確是
Android Gradle Build Error:Some file crunching failed, see logs for details解決辦法
Android Gradle Build Error:Some file