java实现微信支付功能
微信支付的具体实现方法,供大家参考,具体内容如下
工具类(用于在微信支付服务后台生成预支付交易单)
packagecom.fengdi.lianmeng.zhifu.weixin;
importcom.fengdi.lianmeng.util.MD5;
importjava.lang.reflect.Field;
importjava.util.HashMap;
importjava.util.Map;
/**
*
*类说明:除被扫支付场景以外,店铺系统先调用该接口在微信支付服务后台生成预支付交易单,
*返回正确的预支付交易回话标识后再按扫码、JSAPI、APP等不同场景生成交易串调起支付。
*@author聂枫
*2016年1月8日上午11:33:21
*/
publicclassUnifiedorderReq{
/**
*公众账号ID
*/
privateStringappid;
/**
*店铺号
*/
privateStringmch_id;
/**
*设备号
*/
privateStringdevice_info;
/**
*随机字符串
*/
privateStringnonce_str;
/**
*签名
*/
privateStringsign;
/**
*商品描述
*/
privateStringbody;
/**
*商品详情
*/
privateStringdetail;
/**
*附加数据
*/
privateStringattach;
/**
*店铺订单号
*/
privateStringout_trade_no;
/**
*货币类型
*/
privateStringfee_type;
/**
*总金额
*/
privateIntegertotal_fee;
/**
*终端IP
*/
privateStringspbill_create_ip;
/**
*交易起始时间
*/
privateStringtime_start;
/**
*交易结束时间
*/
privateStringtime_expire;
/**
*商品标记
*/
privateStringgoods_tag;
/**
*通知地址
*/
privateStringnotify_url;
/**
*交易类型
*/
privateStringtrade_type;
/**
*商品ID
*/
privateStringproduct_id;
/**
*指定支付方式
*/
privateStringlimit_pay;
/**
*用户标识
*/
privateStringopenid;
publicStringgetAppid(){
returnappid;
}
publicvoidsetAppid(Stringappid){
this.appid=appid;
}
publicStringgetMch_id(){
returnmch_id;
}
publicvoidsetMch_id(Stringmch_id){
this.mch_id=mch_id;
}
publicStringgetDevice_info(){
returndevice_info;
}
publicvoidsetDevice_info(Stringdevice_info){
this.device_info=device_info;
}
publicStringgetNonce_str(){
returnnonce_str;
}
publicvoidsetNonce_str(Stringnonce_str){
this.nonce_str=nonce_str;
}
publicStringgetSign(){
returnsign;
}
publicvoidsetSign(Stringsign){
this.sign=sign;
}
publicStringgetBody(){
returnbody;
}
publicvoidsetBody(Stringbody){
this.body=body.length()>40?body.substring(0,40):body;
}
publicStringgetDetail(){
returndetail;
}
publicvoidsetDetail(Stringdetail){
this.detail=detail;
}
publicStringgetAttach(){
returnattach;
}
publicvoidsetAttach(Stringattach){
this.attach=attach;
}
publicStringgetOut_trade_no(){
returnout_trade_no;
}
publicvoidsetOut_trade_no(Stringout_trade_no){
this.out_trade_no=out_trade_no;
}
publicStringgetFee_type(){
returnfee_type;
}
publicvoidsetFee_type(Stringfee_type){
this.fee_type=fee_type;
}
publicIntegergetTotal_fee(){
returntotal_fee;
}
publicvoidsetTotal_fee(Integertotal_fee){
this.total_fee=total_fee;
}
publicStringgetSpbill_create_ip(){
returnspbill_create_ip;
}
publicvoidsetSpbill_create_ip(Stringspbill_create_ip){
this.spbill_create_ip=spbill_create_ip;
}
publicStringgetTime_start(){
returntime_start;
}
publicvoidsetTime_start(Stringtime_start){
this.time_start=time_start;
}
publicStringgetTime_expire(){
returntime_expire;
}
publicvoidsetTime_expire(Stringtime_expire){
this.time_expire=time_expire;
}
publicStringgetGoods_tag(){
returngoods_tag;
}
publicvoidsetGoods_tag(Stringgoods_tag){
this.goods_tag=goods_tag;
}
publicStringgetNotify_url(){
returnnotify_url;
}
publicvoidsetNotify_url(Stringnotify_url){
this.notify_url=notify_url;
}
publicStringgetTrade_type(){
returntrade_type;
}
publicvoidsetTrade_type(Stringtrade_type){
this.trade_type=trade_type;
}
publicStringgetProduct_id(){
returnproduct_id;
}
publicvoidsetProduct_id(Stringproduct_id){
this.product_id=product_id;
}
publicStringgetLimit_pay(){
returnlimit_pay;
}
publicvoidsetLimit_pay(Stringlimit_pay){
this.limit_pay=limit_pay;
}
publicStringgetOpenid(){
returnopenid;
}
publicvoidsetOpenid(Stringopenid){
this.openid=openid;
}
@Override
publicStringtoString(){
StringBuilderbuilder=newStringBuilder();
builder.append("UnifiedorderReq[appid=");
builder.append(appid);
builder.append(",mch_id=");
builder.append(mch_id);
builder.append(",device_info=");
builder.append(device_info);
builder.append(",nonce_str=");
builder.append(nonce_str);
builder.append(",sign=");
builder.append(sign);
builder.append(",body=");
builder.append(body);
builder.append(",detail=");
builder.append(detail);
builder.append(",attach=");
builder.append(attach);
builder.append(",out_trade_no=");
builder.append(out_trade_no);
builder.append(",fee_type=");
builder.append(fee_type);
builder.append(",total_fee=");
builder.append(total_fee);
builder.append(",spbill_create_ip=");
builder.append(spbill_create_ip);
builder.append(",time_start=");
builder.append(time_start);
builder.append(",time_expire=");
builder.append(time_expire);
builder.append(",goods_tag=");
builder.append(goods_tag);
builder.append(",notify_url=");
builder.append(notify_url);
builder.append(",trade_type=");
builder.append(trade_type);
builder.append(",product_id=");
builder.append(product_id);
builder.append(",limit_pay=");
builder.append(limit_pay);
builder.append(",openid=");
builder.append(openid);
builder.append("]");
returnbuilder.toString();
}
publicStringtoSignString(){
Class>clz=this.getClass();
Field[]fields=clz.getDeclaredFields();
StringBuilderbuilder=newStringBuilder();
for(Fieldfield:fields){
builder.append(field.getName());
}
returnbuilder.toString();
}
publicStringsignString(){
StringBuilderbuilder=newStringBuilder();
builder.append("appid="+appid);
if(attach!=null){
builder.append("&attach="+attach);
}
builder.append("&body="+body);
builder.append("&mch_id="+mch_id);
builder.append("&nonce_str="+nonce_str);
builder.append("¬ify_url="+notify_url);
if(!trade_type.equals("APP")){
builder.append("&openid="+openid);
}
builder.append("&out_trade_no="+out_trade_no);
builder.append("&spbill_create_ip="+spbill_create_ip);
builder.append("&total_fee="+total_fee);
builder.append("&trade_type="+trade_type);
builder.append("&key="+FgWxConfig.mobilekey);
returnbuilder.toString();
}
publicStringwapSignString(){
StringBuilderbuilder=newStringBuilder();
builder.append("appid="+appid);
if(attach!=null){
builder.append("&attach="+attach);
}
builder.append("&body="+body);
builder.append("&mch_id="+mch_id);
builder.append("&nonce_str="+nonce_str);
builder.append("¬ify_url="+notify_url);
if(!trade_type.equals("APP")){
builder.append("&openid="+openid);
}
builder.append("&out_trade_no="+out_trade_no);
builder.append("&spbill_create_ip="+spbill_create_ip);
builder.append("&total_fee="+total_fee);
builder.append("&trade_type="+trade_type);
builder.append("&key="+FgWxConfig.key);
returnbuilder.toString();
}
publicStringtoXml(){
return""+
""+appid+" "+
(attach!=null?""+attach+" ":"")+
""+body+""+
""+mch_id+" "+
""+nonce_str+" "+
""+notify_url+" "+
(trade_type.equals("APP")==true?"":""+openid+" ")+
""+out_trade_no+" "+
""+spbill_create_ip+" "+
""+total_fee+" "+
""+trade_type+" "+
""+MD5.encryptByMD5(signString()).toUpperCase()+" "+
" ";
}
publicStringtoWapXml(){
return""+
""+appid+" "+
(attach!=null?""+attach+" ":"")+
""+body+""+
""+mch_id+" "+
""+nonce_str+" "+
""+notify_url+" "+
(trade_type.equals("APP")==true?"":""+openid+" ")+
""+out_trade_no+" "+
""+spbill_create_ip+" "+
""+total_fee+" "+
""+trade_type+" "+
""+MD5.encryptByMD5(wapSignString()).toUpperCase()+" "+
" ";
}
/*支付查询签名字符串*/
publicStringsignQueryString(Stringtransaction_id){
StringBuilderbuilder=newStringBuilder();
builder.append("appid="+appid);
builder.append("&body="+body);
builder.append("&mch_id="+mch_id);
builder.append("&nonce_str="+nonce_str);
builder.append("&transaction_id="+transaction_id);
builder.append("&key="+FgWxConfig.mobilekey);
returnbuilder.toString();
}
/*支付查询*/
publicStringtoQueryXml(Stringtransaction_id){
StringBuildersBuilder=newStringBuilder();
sBuilder.append("");
sBuilder.append(""+appid+" ");
sBuilder.append(""+body+"");
sBuilder.append(""+mch_id+" ");
sBuilder.append(""+nonce_str+" ");
sBuilder.append(""+transaction_id+" ");
sBuilder.append(""+MD5.encryptByMD5(signQueryString(transaction_id)).toUpperCase()+" ");
sBuilder.append(" ");
returnsBuilder.toString();
}
publicMaptoMap(){
Mapparams=newHashMap();
params.put("appid",appid);
if(attach!=null){
params.put("attach",attach);
}
params.put("body",body);
params.put("mch_id",mch_id);
params.put("nonce_str",nonce_str);
params.put("notify_url",notify_url);
if(!trade_type.equals("APP")){
params.put("openid",openid);
}
params.put("out_trade_no",out_trade_no);
params.put("spbill_create_ip",spbill_create_ip);
params.put("total_fee",total_fee);
params.put("trade_type",trade_type);
params.put("sign",MD5.encryptByMD5(signString()).toUpperCase());
returnparams;
}
组装工具类数据
privateAppWeixinPayResponseappUnifiedorderReq(Orderorder,Membermember,HttpServletRequestrequest){
//获取支付参数
UnifiedorderRequnifiedorderReq=newUnifiedorderReq();
unifiedorderReq.setBody(order.getOrderName().length()>50?order.getOrderName().substring(0,50):order.getOrderName());
log.error(unifiedorderReq.getBody().length()+"--"+unifiedorderReq.getBody());
unifiedorderReq.setAttach(order.getOrderNo());
unifiedorderReq.setTotal_fee(order.getRealAmt().intValue());
unifiedorderReq.setTrade_type("APP");//此处可修改为JSAPI
unifiedorderReq.setOut_trade_no(order.getOrderNo()+RandomUtils.nextInt(100,1000));
unifiedorderReq.setSpbill_create_ip(getIpAddr(request));
unifiedorderReq.setOpenid(member.getOpenid());
returnpayService.appUnifiedorderReq(unifiedorderReq,PayCategory.order.toString());
}
微信统一下单
publicAppWeixinPayResponseappUnifiedorderReq(UnifiedorderRequnifiedorderReq,StringpayCategory)
throwsFdServiceException{
unifiedorderReq.setAppid(FgWxConfig.appid_app);
unifiedorderReq.setMch_id(FgWxConfig.mchId);
unifiedorderReq.setNonce_str(Random2Utils.generateString(20));
if(payCategory.equals(PayCategory.order.toString())){
unifiedorderReq.setNotify_url(fgProperties.getDomainUrl()+FgWxConfig.weixinOrderNotifyCallBack);
}elseif(payCategory.equals(PayCategory.recharge.toString())){
unifiedorderReq.setNotify_url(fgProperties.getDomainUrl()+FgWxConfig.weixinRechargeNotifyCallBack);
}else{
thrownewFdServiceException(ErrorCode.ILLEGAL_ARGUMENT,"微信参数类型["+payCategory+"]异常");
}
unifiedorderReq.setSign(MD5.encryptByMD5(unifiedorderReq.wapSignString()).toUpperCase());
logger.info("unifiedorder返回数据unifiedorderReq:"+unifiedorderReq);
Stringunifiedorder=FgHttp.sendPost(FgWxConfig.unifiedorderUrl,unifiedorderReq.toWapXml());
logger.info("unifiedorder返回数据unifiedorder:"+unifiedorder);
AppWeixinPayResponseappWeixinPayResponse=newAppWeixinPayResponse();
try{
Mapmap=XmlHelper.parseResXML(unifiedorder);
if("SUCCESS".equals(map.get("return_code"))&&"SUCCESS".equals(map.get("result_code"))){
logger.info("微信统一下单返回成功:"+map);
appWeixinPayResponse.setAppid(FgWxConfig.appid_app);
appWeixinPayResponse.setNoncestr((String)map.get("nonce_str"));
appWeixinPayResponse.setPartnerid(FgWxConfig.mchId);
appWeixinPayResponse.setPrepayid((String)map.get("prepay_id"));
appWeixinPayResponse.setTimestamp((System.currentTimeMillis()+"").substring(0,10));
appWeixinPayResponse.setSign(MD5.encryptByMD5(appWeixinPayResponse.wapSignString()).toUpperCase());
}else{
logger.info("微信统一下单返回失败:"+map);
thrownewFdServiceException(ErrorCode.ILLEGAL_ARGUMENT,"微信统一下单返回失败:"+map.get("return_msg"));
}
}catch(IOExceptione){
e.printStackTrace();
}catch(ParserConfigurationExceptione){
e.printStackTrace();
}catch(SAXExceptione){
e.printStackTrace();
}
returnappWeixinPayResponse;//直接将参数返回给前端,发起支付
}
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。