Procházet zdrojové kódy

变更部分推送文案,增加jssdk配置获取接口,增加微信支付相关

刘韬 před 5 roky
rodič
revize
e8501d4e06

+ 17 - 0
PacsOnline_Wechat_Patient/src/main/java/com/zskk/controller/WeixinApiController.java

@@ -1,5 +1,7 @@
 package com.zskk.controller;
 
+import java.util.UUID;
+
 import com.google.protobuf.DescriptorProtos.FieldOptions.JSType;
 import com.jfinal.kit.PropKit;
 import com.jfinal.weixin.sdk.api.AccessTokenApi;
@@ -20,6 +22,9 @@ import com.jfinal.weixin.sdk.jfinal.ApiController;
 import com.zskk.model.Exams;
 import com.zskk.model.Institution;
 import com.zskk.model.Report;
+import com.zskk.service.ServiceFactory;
+import com.zskk.service.WeixinService;
+import com.zskk.service.bean.WxJSConfigBean;
 
 public class WeixinApiController extends ApiController {
 
@@ -243,6 +248,18 @@ public class WeixinApiController extends ApiController {
         ApiConfigKit.setThreadLocalAppId(appId);
 //        String string = PaymentApi.pushOrder(j);
     }
+    
+    /*/
+     * 获取JS-SDK的配置信息
+     */
+    public WxJSConfigBean getJsSdkConfig() 
+    {
+    	WeixinService wService = ServiceFactory.getService(WeixinService.class);
+    	WxJSConfigBean wxJSConfigBean = wService.getWeixinJSSDKConfig(this.getRequest().getHeader("Referer"));
+    	return wxJSConfigBean;
+	}
+
+	
     /**
      * 长链接转成短链接
      */

+ 2 - 2
PacsOnline_Wechat_Patient/src/main/java/com/zskk/controller/WeixinMsgController.java

@@ -49,9 +49,9 @@ public class WeixinMsgController extends MsgControllerAdapter {
 			list.add(articles1);
 			CustomServiceApi.sendNews(inTextMsg.getFromUserName(), list);
 			renderNull();
-			}else if ("233".equalsIgnoreCase(msgContent)) {
+			}else {
 				OutTextMsg outMsgs = new OutTextMsg(inTextMsg);
-				outMsgs.setContent("欢迎关注中世康恺电子胶片平台!\n使用微信或者本公众号内的\"扫一扫\",扫描报告上的二维码,即可查看电子影像和报告");
+				outMsgs.setContent("欢迎关注中世康恺电子胶片平台!\n使用微信或者本公众号内的\"扫一扫\",扫描报告上的二维码,即可查看电子影像和报告\n如有疑问请拨打010-53932350");
 				render(outMsgs);
 			}
     }

+ 451 - 2
PacsOnline_Wechat_Patient/src/main/java/com/zskk/controller/WeixinPayController.java

@@ -1,7 +1,456 @@
 package com.zskk.controller;
 
-import com.jfinal.weixin.sdk.jfinal.ApiController;
+import java.util.HashMap;
+import java.util.Map;
 
-public class WeixinPayController extends ApiController {
+import com.jfinal.core.Controller;
+import com.jfinal.core.NotAction;
+import com.jfinal.kit.HttpKit;
+import com.jfinal.kit.StrKit;
+import com.jfinal.weixin.sdk.api.PaymentApi;
+import com.jfinal.weixin.sdk.api.PaymentApi.TradeType;
+import com.jfinal.weixin.sdk.kit.IpKit;
+import com.jfinal.weixin.sdk.kit.PaymentKit;
+import com.jfinal.weixin.sdk.utils.HttpUtils;
+import com.jfinal.weixin.sdk.utils.JsonUtils;
 
+public class WeixinPayController extends Controller {
+
+	//商户相关资料
+    private static String appid = "";
+    private static String partner = "";
+    private static String paternerKey = "";
+    private static String notify_url = "http://wechat.pacsonline.cn/wx_patient/pay/pay_notify";
+
+    /**
+     * 公众号支付js-sdk
+     */
+    public void index() {
+        // openId,采用 网页授权获取 access_token API:SnsAccessTokenApi获取
+        String openId = "";
+
+        // 统一下单文档地址:https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=9_1
+
+        Map<String, String> params = new HashMap<String, String>();
+        params.put("appid", appid);
+        params.put("mch_id", partner);
+        params.put("body", "JFinal2.0极速开发");
+        params.put("out_trade_no", "977773682111");
+        params.put("total_fee", "1");
+
+        String ip = IpKit.getRealIp(getRequest());
+        if (StrKit.isBlank(ip)) {
+            ip = "127.0.0.1";
+        }
+
+        params.put("spbill_create_ip", ip);
+        params.put("trade_type", TradeType.JSAPI.name());
+        params.put("nonce_str", System.currentTimeMillis() / 1000 + "");
+        params.put("notify_url", notify_url);
+        params.put("openid", openId);
+
+        String sign = PaymentKit.createSign(params, paternerKey);
+        params.put("sign", sign);
+        String xmlResult = PaymentApi.pushOrder(params);
+
+        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 (StrKit.isBlank(return_code) || !"SUCCESS".equals(return_code)) {
+            renderText(return_msg);
+            return;
+        }
+        String result_code = result.get("result_code");
+        if (StrKit.isBlank(result_code) || !"SUCCESS".equals(result_code)) {
+            renderText(return_msg);
+            return;
+        }
+        // 以下字段在return_code 和result_code都为SUCCESS的时候有返回
+        String prepay_id = result.get("prepay_id");
+
+        Map<String, String> packageParams = new HashMap<String, String>();
+        packageParams.put("appId", appid);
+        packageParams.put("timeStamp", System.currentTimeMillis() / 1000 + "");
+        packageParams.put("nonceStr", System.currentTimeMillis() + "");
+        packageParams.put("package", "prepay_id=" + prepay_id);
+        packageParams.put("signType", "MD5");
+        String packageSign = PaymentKit.createSign(packageParams, paternerKey);
+        packageParams.put("paySign", packageSign);
+
+        String jsonStr = JsonUtils.toJson(packageParams);
+        setAttr("json", jsonStr);
+        System.out.println(jsonStr);
+        render("/jsp/pay.jsp");
+    }
+
+    /**
+     * 支付成功通知
+     */
+    public void pay_notify() {
+        // 支付结果通用通知文档: https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=9_7
+        String xmlMsg = HttpKit.readData(getRequest());
+        System.out.println("支付通知="+xmlMsg);
+        Map<String, String> params = PaymentKit.xmlToMap(xmlMsg);
+
+        String result_code  = params.get("result_code");
+        // 总金额
+        String totalFee     = params.get("total_fee");
+        // 商户订单号
+        String orderId      = params.get("out_trade_no");
+        // 微信支付订单号
+        String transId      = params.get("transaction_id");
+        // 支付完成时间,格式为yyyyMMddHHmmss
+        String timeEnd      = params.get("time_end");
+
+        // 注意重复通知的情况,同一订单号可能收到多次通知,请注意一定先判断订单状态
+        // 避免已经成功、关闭、退款的订单被再次更新
+
+        if(PaymentKit.verifyNotify(params, paternerKey)){
+            if (("SUCCESS").equals(result_code)) {
+                //更新订单信息
+                System.out.println("更新订单信息");
+
+                Map<String, String> xml = new HashMap<String, String>();
+                xml.put("return_code", "SUCCESS");
+                xml.put("return_msg", "OK");
+                renderText(PaymentKit.toXml(xml));
+                return;
+            }
+        }
+        renderText("");
+    }
+    /**
+     *
+     * @author Javen
+     * 2016年5月14日
+     * PC扫码支付获取二维码(模式一)
+     */
+    @NotAction
+    public String getCodeUrl(String productId){
+        String url="weixin://wxpay/bizpayurl?sign=%s&appid=%s&mch_id=%s&product_id=%s&time_stamp=%s&nonce_str=%s";
+
+        String timeStamp=Long.toString(System.currentTimeMillis() / 1000);
+        String nonceStr=Long.toString(System.currentTimeMillis());
+        Map<String, String> packageParams = new HashMap<String, String>();
+        packageParams.put("appid", appid);
+        packageParams.put("mch_id", partner);
+        packageParams.put("product_id", productId);
+        packageParams.put("time_stamp", timeStamp);
+        packageParams.put("nonce_str", nonceStr);
+        String packageSign = PaymentKit.createSign(packageParams, paternerKey);
+
+        return String.format(url, packageSign, appid, partner, productId, timeStamp, nonceStr);
+    }
+
+    public void test(){
+        String product_id = "001";
+        renderText(getCodeUrl(product_id));
+    }
+
+    /**
+     * @author Javen
+     * 2016年5月14日
+     * PC扫码支付回调(模式一)
+     */
+    public void wxpay(){
+        String result = HttpKit.readData(getRequest());
+        System.out.println("回调结果="+result);
+        /**
+         * 获取返回的信息内容中各个参数的值
+         */
+        Map<String, String> map = PaymentKit.xmlToMap(result);
+        for (String key : map.keySet()) {
+            System.out.println("key= "+ key + " and value= " + map.get(key));
+        }
+
+        String appid=map.get("appid");
+        String openid = map.get("openid");
+        String mch_id = map.get("mch_id");
+        String is_subscribe = map.get("is_subscribe");
+        String nonce_str = map.get("nonce_str");
+        String product_id = map.get("product_id");
+        String sign = map.get("sign");
+        Map<String, String> packageParams = new HashMap<String, String>();
+        packageParams.put("appid", appid);
+        packageParams.put("openid", openid);
+        packageParams.put("mch_id",mch_id);
+        packageParams.put("is_subscribe",is_subscribe);
+        packageParams.put("nonce_str",nonce_str);
+        packageParams.put("product_id", product_id);
+
+        String packageSign = PaymentKit.createSign(packageParams, paternerKey);
+        if (sign.equals(packageSign)) {
+            // 统一下单文档地址:https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=9_1
+
+            Map<String, String> params = new HashMap<String, String>();
+            params.put("appid", appid);
+            params.put("mch_id", mch_id);
+            params.put("body", "测试扫码支付");
+            String out_trade_no=Long.toString(System.currentTimeMillis());
+            params.put("out_trade_no", out_trade_no);
+            int price=((int)(Float.valueOf(10)*100));
+            params.put("total_fee", price+"");
+            params.put("attach", out_trade_no);
+
+            String ip = IpKit.getRealIp(getRequest());
+            if (StrKit.isBlank(ip)) {
+                ip = "127.0.0.1";
+            }
+
+            params.put("spbill_create_ip", ip);
+            params.put("trade_type", TradeType.NATIVE.name());
+            params.put("nonce_str", System.currentTimeMillis() / 1000 + "");
+            params.put("notify_url", notify_url);
+            params.put("openid", openid);
+
+            String paysign = PaymentKit.createSign(params, paternerKey);
+            params.put("sign", paysign);
+
+            String xmlResult = PaymentApi.pushOrder(params);
+
+            System.out.println("prepay_xml>>>"+xmlResult);
+            Map<String, String> payResult = PaymentKit.xmlToMap(xmlResult);
+
+            String return_code = payResult.get("return_code");
+            String return_msg = payResult.get("return_msg");
+
+            if (StrKit.isBlank(return_code) || !"SUCCESS".equals(return_code)) {
+                System.out.println("return_code>>>"+return_msg);
+                return;
+            }
+            if (StrKit.isBlank(return_msg) || !"OK".equals(return_msg)) {
+                System.out.println("return_msg>>>>"+return_msg);
+                return;
+            }
+            // 以下字段在return_code 和result_code都为SUCCESS的时候有返回
+            String prepay_id = payResult.get("prepay_id");
+
+            Map<String, String> prepayParams = new HashMap<String, String>();
+            prepayParams.put("return_code", "SUCCESS");
+            prepayParams.put("appId", appid);
+            prepayParams.put("mch_id", mch_id);
+            prepayParams.put("nonceStr", System.currentTimeMillis() + "");
+            prepayParams.put("prepay_id", prepay_id);
+            prepayParams.put("result_code", "SUCCESS");
+            String prepaySign = PaymentKit.createSign(prepayParams, paternerKey);
+            prepayParams.put("sign", prepaySign);
+            String xml = PaymentKit.toXml(prepayParams);
+
+            System.out.println(xml);
+
+            renderText(xml);
+        }
+    }
+    
+    
+    /**
+	 * 刷卡支付
+	 * 文档:https://pay.weixin.qq.com/wiki/doc/api/micropay.php?chapter=5_1
+	 */
+	public void micropay(){
+		String url="https://api.mch.weixin.qq.com/pay/micropay";
+		
+		String total_fee="1";
+		String auth_code = getPara("auth_code");//测试时直接手动输入刷卡页面上的18位数字
+		
+		Map<String, String> params = new HashMap<String, String>();
+		params.put("appid", appid);
+		params.put("mch_id", partner);
+		params.put("device_info", "javen205");//终端设备号
+		params.put("nonce_str", System.currentTimeMillis() / 1000 + "");
+		params.put("body", "刷卡支付测试");
+//		params.put("detail", "json字符串");//非必须
+		params.put("attach", "javen205");//附加参数非必须
+		String out_trade_no=System.currentTimeMillis()+"";
+		params.put("out_trade_no", out_trade_no);
+		params.put("total_fee", total_fee);
+		
+		String ip = IpKit.getRealIp(getRequest());
+		if (StrKit.isBlank(ip)) {
+			ip = "127.0.0.1";
+		}
+		
+		params.put("spbill_create_ip", ip);
+		params.put("auth_code", auth_code);
+		
+		String sign = PaymentKit.createSign(params, paternerKey);
+		params.put("sign", sign);
+		
+		String xmlResult = HttpUtils.post(url, PaymentKit.toXml(params));
+		//同步返回结果
+		System.out.println("xmlResult:"+xmlResult);
+		
+		Map<String, String> result = PaymentKit.xmlToMap(xmlResult);
+		String return_code = result.get("return_code");
+		if (StrKit.isBlank(return_code) || !"SUCCESS".equals(return_code)) {
+			//通讯失败 
+			String err_code = result.get("err_code");
+			//用户支付中,需要输入密码
+			if (err_code.equals("USERPAYING")) {
+				//等待5秒后调用【查询订单API】https://pay.weixin.qq.com/wiki/doc/api/micropay.php?chapter=9_2
+				
+			}
+			renderText("通讯失败>>"+xmlResult);
+			return;
+		}
+		
+		String result_code = result.get("result_code");
+		if (StrKit.isBlank(result_code) || !"SUCCESS".equals(result_code)) {
+			//支付失败
+			renderText("支付失败>>"+xmlResult);
+			return;
+		}
+		
+		//支付成功 返回参会入库 业务逻辑处理
+		
+		renderText(xmlResult);
+	}
+
+    /**
+     * PC支付模式二,PC支付不需要openid
+     */
+    public void pcModeTwo() {
+        // 统一下单文档地址:https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=9_1
+        Map<String, String> params = new HashMap<String, String>();
+        params.put("appid", appid);
+        params.put("mch_id", partner);
+        params.put("body", "JFinal2.2极速开发");
+
+        // 商品ID trade_type=NATIVE,此参数必传。此id为二维码中包含的商品ID,商户自行定义。
+        params.put("product_id", "1");
+        // 商户订单号 商户系统内部的订单号,32个字符内、可包含字母, 其他说明见商户订单号
+        params.put("out_trade_no", "97777368222");
+        params.put("total_fee", "1");
+
+        String ip = IpKit.getRealIp(getRequest());
+        if (StrKit.isBlank(ip)) {
+            ip = "127.0.0.1";
+        }
+
+        params.put("spbill_create_ip", ip);
+        params.put("trade_type", TradeType.NATIVE.name());
+        params.put("nonce_str", System.currentTimeMillis() / 1000 + "");
+        params.put("notify_url", notify_url);
+
+        String sign = PaymentKit.createSign(params, paternerKey);
+        params.put("sign", sign);
+        String xmlResult = PaymentApi.pushOrder(params);
+
+        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 (StrKit.isBlank(return_code) || !"SUCCESS".equals(return_code)) {
+            renderText(return_msg);
+            return;
+        }
+        String result_code = result.get("result_code");
+        if (StrKit.isBlank(result_code) || !"SUCCESS".equals(result_code)) {
+            renderText(return_msg);
+            return;
+        }
+        // 以下字段在return_code 和result_code都为SUCCESS的时候有返回
+        String prepay_id = result.get("prepay_id");
+        // trade_type为NATIVE是有返回,可将该参数值生成二维码展示出来进行扫码支付
+        String code_url = result.get("code_url");
+
+        setAttr("code_url", code_url);
+        render("/jsp/pc_pay.jsp");
+    }
+
+    /**
+     * wap支付第一版本
+     */
+    public void wap1() {
+        Map<String, String> params = new HashMap<String, String>();
+        params.put("appid", appid);
+        params.put("mch_id", partner);
+        params.put("body", "JFinal2.0极速开发");
+        params.put("out_trade_no", "977773682111");
+        params.put("total_fee", "1");
+
+        String ip = IpKit.getRealIp(getRequest());
+        if (StrKit.isBlank(ip)) {
+            ip = "127.0.0.1";
+        }
+
+        params.put("spbill_create_ip", ip);
+        params.put("trade_type", TradeType.WAP.name());
+        params.put("nonce_str", System.currentTimeMillis() / 1000 + "");
+        params.put("notify_url", notify_url);
+
+        String sign = PaymentKit.createSign(params, paternerKey);
+        params.put("sign", sign);
+        String xmlResult = PaymentApi.pushOrder(params);
+
+        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 (StrKit.isBlank(return_code) || !"SUCCESS".equals(return_code)) {
+            renderText(return_msg);
+            return;
+        }
+        String result_code = result.get("result_code");
+        if (StrKit.isBlank(result_code) || !"SUCCESS".equals(result_code)) {
+            renderText(return_msg);
+            return;
+        }
+        // 以下字段在return_code 和result_code都为SUCCESS的时候有返回
+        String prepayId = result.get("prepay_id");
+        String url = PaymentApi.getDeepLink(appid, prepayId, paternerKey);
+
+        // 微信那边的开发建议用a标签打开该链接
+        setAttr("url", url);
+    }
+
+    /**
+     * wap支付第二版
+     */
+    public void wap2() {
+        Map<String, String> params = new HashMap<String, String>();
+        params.put("appid", appid);
+        params.put("mch_id", partner);
+        params.put("body", "JFinal2.0极速开发");
+        params.put("out_trade_no", "977773682111");
+        params.put("total_fee", "1");
+
+        String ip = IpKit.getRealIp(getRequest());
+        if (StrKit.isBlank(ip)) {
+            ip = "127.0.0.1";
+        }
+
+        params.put("spbill_create_ip", ip);
+        params.put("trade_type", TradeType.MWEB.name());
+        params.put("nonce_str", System.currentTimeMillis() / 1000 + "");
+        params.put("notify_url", notify_url);
+
+        String sign = PaymentKit.createSign(params, paternerKey);
+        params.put("sign", sign);
+        String xmlResult = PaymentApi.pushOrder(params);
+
+        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 (StrKit.isBlank(return_code) || !"SUCCESS".equals(return_code)) {
+            renderText(return_msg);
+            return;
+        }
+        String result_code = result.get("result_code");
+        if (StrKit.isBlank(result_code) || !"SUCCESS".equals(result_code)) {
+            renderText(return_msg);
+            return;
+        }
+        // 以下字段在return_code 和result_code都为SUCCESS的时候有返回
+        String url = result.get("mweb_url");
+
+        // 微信那边的开发建议用a标签打开该链接
+        setAttr("url", url);
+    }
 }

+ 36 - 0
PacsOnline_Wechat_Patient/src/main/java/com/zskk/service/WeixinService.java

@@ -2,18 +2,25 @@ package com.zskk.service;
 
 import java.io.UnsupportedEncodingException;
 import java.net.URLEncoder;
+import java.util.UUID;
 
 import javax.management.loading.PrivateClassLoader;
 
+import com.jfinal.kit.HashKit;
 import com.jfinal.plugin.activerecord.ActiveRecordPlugin;
 import com.jfinal.plugin.druid.DruidPlugin;
+import com.jfinal.weixin.sdk.api.ApiConfigKit;
 import com.jfinal.weixin.sdk.api.ApiResult;
+import com.jfinal.weixin.sdk.api.JsTicket;
+import com.jfinal.weixin.sdk.api.JsTicketApi;
 import com.jfinal.weixin.sdk.api.SnsAccessToken;
 import com.jfinal.weixin.sdk.api.SnsAccessTokenApi;
 import com.jfinal.weixin.sdk.api.SnsApi;
+import com.jfinal.weixin.sdk.api.JsTicketApi.JsApiType;
 import com.zskk.model.Report;
 import com.zskk.model.User;
 import com.zskk.model._MappingKit;
+import com.zskk.service.bean.WxJSConfigBean;
 
 public class WeixinService {
 	
@@ -60,6 +67,35 @@ public class WeixinService {
 		return snsAccessToken;
 	}
 	
+	/**
+	 * 获取JsTicket,并生成JS-SDK调用参数
+	 * @param requstUrl
+	 * @return
+	 */
+	public WxJSConfigBean getWeixinJSSDKConfig(String requstUrl) {
+		JsTicket jsTicket = JsTicketApi.getTicket(JsApiType.jsapi);
+		String jsapi_ticket  = jsTicket.getTicket();
+		String nonce_str 	 = create_nonce_str();
+		String url 		     = requstUrl;
+		String timestamp 	 = create_timestamp();
+		String str 			 = "jsapi_ticket=" + jsapi_ticket + "&noncestr=" + nonce_str + "&timestamp=" + timestamp + "&url=" + url;
+		String signature 	 = HashKit.sha1(str);
+		
+    	WxJSConfigBean wxJSConfigBean = new WxJSConfigBean();
+    	wxJSConfigBean.setAppId(ApiConfigKit.getAppId());
+    	wxJSConfigBean.setNonceStr(nonce_str);
+    	wxJSConfigBean.setTimestamp(timestamp);
+    	wxJSConfigBean.setSignature(signature);
+		return wxJSConfigBean;
+	}
+    
+	private String create_nonce_str() {
+		return UUID.randomUUID().toString();
+	}
+	
+	private static String create_timestamp() {
+		return Long.toString(System.currentTimeMillis() / 1000);
+	}
 	/**
 	 * 拉取用户信息
 	 * @param accessToken

+ 49 - 0
PacsOnline_Wechat_Patient/src/main/java/com/zskk/service/bean/WxJSConfigBean.java

@@ -0,0 +1,49 @@
+package com.zskk.service.bean;
+
+public class WxJSConfigBean {
+
+	// 微信APPID
+	private String appId;
+
+	// 时间戳
+	private String timestamp;
+
+	// 随机字符串
+	private String nonceStr;
+
+	// 签名信息
+	private String signature;
+
+	public String getAppId() {
+		return appId;
+	}
+
+	public void setAppId(String appId) {
+		this.appId = appId;
+	}
+
+	public String getTimestamp() {
+		return timestamp;
+	}
+
+	public void setTimestamp(String timestamp) {
+		this.timestamp = timestamp;
+	}
+
+	public String getNonceStr() {
+		return nonceStr;
+	}
+
+	public void setNonceStr(String nonceStr) {
+		this.nonceStr = nonceStr;
+	}
+
+	public String getSignature() {
+		return signature;
+	}
+
+	public void setSignature(String signature) {
+		this.signature = signature;
+	}
+
+}