WAP 外部浏览器 调用 微信H5支付 java开发

先贴代码:

处理支付得Contoller

================================================================

import java.io.IOException;
import java.security.MessageDigest;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Random;
import java.util.Set;
import java.util.TreeMap;
import java.util.UUID;


import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;


import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;


import com.ejun.crud.bean.H5ScencInfo;
import com.ejun.crud.bean.H5ScencInfo.H5;
import com.ejun.crud.test.Demo.RandomType;
import com.jpay.ext.kit.HttpKit;
import com.jpay.ext.kit.IpKit;
import com.jpay.ext.kit.PaymentKit;
import com.jpay.ext.kit.StrKit;
import com.jpay.util.HttpUtils;
import com.jpay.weixin.api.WxPayApi.TradeType;
import com.jpay.weixin.api.WxPayApiConfig;
import com.jpay.weixin.api.WxPayApiConfigKit;
@Controller
public class OrderWxpay  {


/**

*/
private static final long serialVersionUID = 1L;
private Logger log = LoggerFactory.getLogger(this.getClass());
private static String mchID="1480406272";
private static String appID="wx92ee752a208a5698";
private static String partnerKey="JIEXING2750898252yibeinuomeng668";
private static String notify_url="www.yibeinuomeng.com/pay_notify";

private static final String UNIFIEDORDER_URL = "https://api.mch.weixin.qq.com/pay/unifiedorder";
/*=====================随机数生成=====================*/
// 随机字符串
private static final String _INT = "0123456789";
private static final String _STR = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
private static final String _ALL = _INT + _STR;


private static final Random RANDOM = new Random();
/**
     * 微信H5 支付
     */
/**  
     * 微信H5 支付--------------------好使  
     * 注意:必须再web页面中发起支付且域名已添加到开发配置中  
* @throws IOException 
* @throws ServletException 
     */  
    @RequestMapping(value ="/paytest",method = {RequestMethod.POST,RequestMethod.GET})  
    @ResponseBody
    public void wapPay(HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException{  
    String ip = IpKit.getRealIp(request);
if (StrKit.isBlank(ip)) {
ip = "127.0.0.1";
}
ip = "49.66.24.130";
H5ScencInfo sceneInfo = new H5ScencInfo();

H5 h5_info = new H5();
h5_info.setType("Wap");
//此域名必须在商户平台--"产品中心"--"开发配置"中添加
String randomstring=random(32, RandomType.ALL);
//随机数
String nonce_str = UUID.randomUUID().toString().replaceAll("-", "");
System.out.println("随机数"+randomstring);
h5_info.setWap_url("http://www.yibeinuomeng.com");
h5_info.setWap_name("伊贝诺萌");
sceneInfo.setH5_info(h5_info);
WxPayApiConfig wxapi=WxPayApiConfig.New();
wxapi.setAppId(appID);
wxapi.setAttach("伊贝诺萌商品支付");
wxapi.setBody("yibeinuomeng.com");
wxapi.setSpbillCreateIp(ip);
wxapi.setTotalFee("520");
wxapi.setTradeType(TradeType.MWEB);
wxapi.setNotifyUrl(notify_url);
wxapi.setOutTradeNo(String.valueOf(System.currentTimeMillis()));
wxapi.setNonceStr(nonce_str);
wxapi.setSceneInfo(h5_info.toString());
wxapi.setMchId(mchID);
wxapi.setAppId(appID);
wxapi.setPaternerKey(partnerKey);
wxapi.setNonceStr(randomstring);
Map<String, String> params = new TreeMap<String, String>();
params.put("appid", wxapi.getAppId());
params.put("body", wxapi.getBody());
params.put("mch_id", wxapi.getMchId());
params.put("nonce_str", wxapi.getNonceStr());
params.put("notify_url", wxapi.getNotifyUrl());
params.put("out_trade_no", wxapi.getOutTradeNo());
params.put("spbill_create_ip", wxapi.getSpbillCreateIp());
params.put("total_fee", wxapi.getTotalFee());
params.put("trade_type", wxapi.getTradeType().toString());
String sign=createSign("UTF-8", params, "JIEXING2750898252yibeinuomeng668");
params.put("sign", sign);
String data=PaymentKit.toXml(params);
System.out.println(params+"AAAAAAAAAAAA");
System.out.println(data);
String xmlResult = HttpUtils.post(UNIFIEDORDER_URL,data );
System.out.println(xmlResult);
Map<String, String> result = PaymentKit.xmlToMap(xmlResult);
String return_code = result.get("return_code");
String return_msg = result.get("return_msg");
if (!PaymentKit.codeIsOK(return_code)) {
log.error("return_code>"+return_code+" return_msg>"+return_msg);
throw new RuntimeException(return_msg);
}
String result_code = result.get("result_code");
if (!PaymentKit.codeIsOK(result_code)) {
log.error("result_code>"+result_code+" return_msg>"+return_msg);
throw new RuntimeException(return_msg);
}
// 以下字段在return_code 和result_code都为SUCCESS的时候有返回
String prepay_id = result.get("prepay_id");
String mweb_url = result.get("mweb_url");
System.out.println("prepay_id:"+prepay_id+" mweb_url:"+mweb_url);
try {
response.sendRedirect(mweb_url);
} catch (IOException e) {
e.printStackTrace();
}
     }
    
  /**
* 随机数生成
* @param count
* @return {String}
*/
public static String random(int count, RandomType randomType) {
if (count == 0) return "";
if (count < 0) {
throw new IllegalArgumentException("Requested random string length " + count + " is less than 0.");
}
char[] buffer = new char[count];
for (int i = 0; i < count; i++) {
if (randomType.equals(RandomType.INT)) {
buffer[i] = _INT.charAt(RANDOM.nextInt(_INT.length()));
} else if (randomType.equals(RandomType.STRING)) {
buffer[i] = _STR.charAt(RANDOM.nextInt(_STR.length()));
}else {
buffer[i] = _ALL.charAt(RANDOM.nextInt(_ALL.length()));
}
}
return new String(buffer);
}

  /** 
     * 微信支付签名算法sign 
     * @param characterEncoding 
     * @param params 
     * @return 
     */  
    @SuppressWarnings("unchecked")  
    public static String createSign(String characterEncoding,Map<String, String> params,String key){  
        StringBuffer sb = new StringBuffer();  
        Set es = params.entrySet();//所有参与传参的参数按照accsii排序(升序)  
        Iterator it = es.iterator();  
        while(it.hasNext()) {  
            Map.Entry entry = (Map.Entry)it.next();  
            String k = (String)entry.getKey();  
            Object v = entry.getValue();  
            if(null != v && !"".equals(v)   
                    && !"sign".equals(k) && !"key".equals(k)) {  
                sb.append(k + "=" + v + "&");  
            }  
        }  
        sb.append("key=" + key);  
        String sign = MD5Encode(sb.toString(), characterEncoding).toUpperCase();  
        return sign;  
    }  

    public static String MD5Encode(String origin, String charsetname) {  
        String resultString = null;  
        try {  
            resultString = new String(origin);  
            MessageDigest md = MessageDigest.getInstance("MD5");  
            if (charsetname == null || "".equals(charsetname))  
                resultString = byteArrayToHexString(md.digest(resultString 
                .getBytes()));  
            else  
                resultString = byteArrayToHexString(md.digest(resultString 
                .getBytes(charsetname)));  
        } catch (Exception exception) {  
        }  
        return resultString;  
    }  
    
    private static String byteArrayToHexString(byte b[]) {  
        StringBuffer resultSb = new StringBuffer();  
        for (int i = 0; i < b.length; i++)  
            resultSb.append(byteToHexString(b[i]));  
        return resultSb.toString();  
    }  
  
    private static String byteToHexString(byte b) {  
        int n = b;  
        if (n < 0)  
            n += 256;  
        int d1 = n / 16;  
        int d2 = n % 16;  
        return hexDigits[d1] + hexDigits[d2];  
    } 
    private static final String hexDigits[] = { "0", "1", "2", "3", "4", "5",  
            "6", "7", "8", "9", "a", "b", "c", "d", "e", "f" };
    
    
    @RequestMapping(value = "/pay_notify",method={RequestMethod.POST,RequestMethod.GET})
@ResponseBody
public String pay_notify(HttpServletRequest request) {
// 支付结果通用通知文档: https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=9_7


String xmlMsg = HttpKit.readData(request);
System.out.println("支付通知="+xmlMsg);
Map<String, String> params = PaymentKit.xmlToMap(xmlMsg);
// String appid  = params.get("appid");
// //商户号
// String mch_id  = params.get("mch_id");
String result_code  = params.get("result_code");
// String openId      = params.get("openid");
// //交易类型
// String trade_type      = params.get("trade_type");
// //付款银行
// String bank_type      = params.get("bank_type");
// // 总金额
// String total_fee     = params.get("total_fee");
// //现金支付金额
// String cash_fee     = params.get("cash_fee");
// // 微信支付订单号
// String transaction_id      = params.get("transaction_id");
// // 商户订单号
// String out_trade_no      = params.get("out_trade_no");
// // 支付完成时间,格式为yyyyMMddHHmmss
// String time_end      = params.get("time_end");

/以下是附加参数///

String attach      = params.get("attach");
// String fee_type      = params.get("fee_type");
// String is_subscribe      = params.get("is_subscribe");
// String err_code      = params.get("err_code");
// String err_code_des      = params.get("err_code_des");
// 注意重复通知的情况,同一订单号可能收到多次通知,请注意一定先判断订单状态
// 避免已经成功、关闭、退款的订单被再次更新
// Order order = Order.dao.getOrderByTransactionId(transaction_id);
// if (order==null) {
if(PaymentKit.verifyNotify(params, WxPayApiConfigKit.getWxPayApiConfig().getPaternerKey())){
if (("SUCCESS").equals(result_code)) {
//更新订单信息
log.warn("更新订单信息:"+attach);
//发送通知等
Map<String, String> xml = new HashMap<String, String>();
xml.put("return_code", "SUCCESS");
xml.put("return_msg", "OK");
return PaymentKit.toXml(xml);
}
}
// }


return null;
}  
 }  

============================================================================

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值