app端微信支付类和JAVA Web 回调类

来源:互联网 发布:安居客网络门店系统 编辑:程序博客网 时间:2024/06/05 03:19
import android.app.Activity;import android.content.Context;import android.content.Intent;import com.androidquery.AQuery;import com.androidquery.callback.AjaxStatus;import com.tencent.mm.sdk.modelmsg.SendAuth;import com.tencent.mm.sdk.modelpay.PayReq;import com.tencent.mm.sdk.openapi.IWXAPI;import com.tencent.mm.sdk.openapi.WXAPIFactory;import org.json.JSONArray;import org.json.JSONObject;import java.util.HashMap;/** * Created by Administrator on 2017/8/31 0031. */public class WechatHelper {    public static final String APPID = "appid";    public static final String STATE_LOGIN = "login";    public static final String STATE_BIND = "bind";//跳转到支付    public static final void pay(Context context, PayReq req) {        IWXAPI api = WXAPIFactory.createWXAPI(context, null);        api.registerApp(APPID);        api.sendReq(req);    }//将JSONArray转为PayReq    public static final PayReq convert2PayReq(JSONArray array) {        try {            PayReq req = new PayReq();            for (int i = 0; i < array.length(); i++) {                JSONObject item = array.getJSONObject(i);                if(item==null){                    continue;                }                String name=item.getString("name");                String value=item.getString("value");                switch (name){                    case "appid":req.appId=value;break;                    case "noncestr":req.nonceStr=value;break;                    case "package":req.packageValue=value;break;                    case "partnerid":req.partnerId=value;break;                    case "prepayid":req.prepayId=value;break;                    case "timestamp":req.timeStamp=value;break;                    case "sign":req.sign=value;break;                }            }            return req;        } catch (Exception e) {            return null;        }    }//跳转到微信登陆    public static final void tologin(Context context) {        sendReq(context, STATE_LOGIN);    }//已经登录,绑定微信    public static final void toBind(Context context) {        sendReq(context, STATE_BIND);    }    private static final void sendReq(Context context, String state) {        //api注册        IWXAPI api = WXAPIFactory.createWXAPI(context, APPID, true);        api.registerApp(APPID);        SendAuth.Req req = new SendAuth.Req();        //授权读取用户信息        req.scope = "snsapi_userinfo";        //自定义信息wechat_login        req.state = state;        //向微信发送请求        api.sendReq(req);    }//绑定回调    public static final void requestBind(Context context, String code) {        HashMap<String, String> hashMap = new HashMap<String, String>();        hashMap.put(AppConfig.Key.BINDTYPE, "2");        hashMap.put(AppConfig.Key.CODE, code);        hashMap.put(AppConfig.Key.TOKEN, UserController.getToken());        final BaseAjaxCallback callback = new BaseAjaxCallback(context, null) {            @Override            public void mOnSuccess(String url, JSONObject json, AjaxStatus status, int code, String message) {                try {                    if (!Utils.isNullOrEmpty(message)) {                        ToastManager.showText(message);                    } else {                        JSONObject data = json.getJSONObject(AppConfig.Key.DATA);                        User user = User.parse(data.toString());                        //绑定成功了                        if (!Utils.isNullOrEmpty(user.getWechat_openid())) {                            UserController.saveUser(user);                            if (Activity_Settings.instance != null) {                                Activity_Settings.instance.refreshAdapter();                                Activity_Settings.instance = null;                            }                        }                    }                } catch (Exception e) {                    String str = e.getLocalizedMessage();                    str += "";                }            }        };        ToastManager.showText("正在绑定,请稍后...");        new AQuery(context).ajax(AppConfig.URLS.BIND_WECHAT_AND_TEL, hashMap, String.class, callback);    }//登陆回调    public static final void requestLogin(final Context context, String code) {        HashMap<String, String> hashMap = new HashMap<String, String>();        hashMap.put(AppConfig.Key.LOGINTYPE, AppConfig.Key.LOGINTYPE_WECHAT);        hashMap.put(AppConfig.Key.CODE, code);        BaseAjaxCallback callback = new BaseAjaxCallback(context, null) {            @Override            public void mOnSuccess(String url, JSONObject json, AjaxStatus status, int code, String message) {                try {                    JSONObject data = json.getJSONObject(AppConfig.Key.DATA);                    User user = User.parse(data.toString());                    UserController.saveUser(user);                    if (UserController.isLogined()) {                        Intent intent = new Intent(context, Activity_Main.class);                        intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);                        context.startActivity(intent);                    } else {                        Intent intent = new Intent(context, Activity_Login.class);                        intent.putExtra(AppConfig.Key.WECHAT_OPENID, user.getWechat_openid());                        context.startActivity(intent);                        Activity activity = (Activity) context;                        if (activity != null && activity.isFinishing() == false) {                            activity.finish();                        }                    }                } catch (Exception e) {                }            }        };        new AQuery(context).ajax(AppConfig.URLS.LOGIN, hashMap, String.class, callback);    }}

public class WXEntryActivity extends Activity implements IWXAPIEventHandler {    @Override    protected void onCreate(@Nullable Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        //注册API        IWXAPI api = WXAPIFactory.createWXAPI(this, WechatHelper.APPID);        api.handleIntent(getIntent(), this);    }    @Override    public void onReq(BaseReq baseReq) {    }    @Override    public void onResp(BaseResp resp) {        if (resp instanceof SendAuth.Resp) {            SendAuth.Resp newResp = (SendAuth.Resp) resp;            if (newResp.errCode == BaseResp.ErrCode.ERR_OK) {                //获取微信传回的code                String code = newResp.code;                switch (newResp.state){                    case WechatHelper.STATE_LOGIN:                        WechatHelper.requestLogin(this, code);                        break;                    case WechatHelper.STATE_BIND:                        WechatHelper.requestBind(this,code);                        break;                }            }        }        finish();    }}

public class WXPayEntryActivity extends Activity implements IWXAPIEventHandler{private static final String TAG = "WXPayEntryActivity";    private IWXAPI api;    @Override    public void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);//setContentView(R.layout.pay_result);    api = WXAPIFactory.createWXAPI(this, WechatHelper.APPID);        api.handleIntent(getIntent(), this);    }@Overrideprotected void onNewIntent(Intent intent) {super.onNewIntent(intent);setIntent(intent);        api.handleIntent(intent, this);}@Overridepublic void onReq(BaseReq req) {}@Overridepublic void onResp(BaseResp resp) {Log.d(TAG, "onPayFinish, errCode = " + resp.errCode);ToastManager.showText(resp.errCode+"");if (resp.getType() == ConstantsAPI.COMMAND_PAY_BY_WX) {if(resp.errCode==BaseResp.ErrCode.ERR_OK){//微信支付充值成功,进行充值成功后的操作,比如:重新获取下用户账号总金额               }}finish();}}



JAVA  Web

public class WechatUtils {private static final String BODY = "余额充值";private static final String URL1 = "https://api.mch.weixin.qq.com/pay/unifiedorder";private static final String PREPAY_ID = "prepay_id";private static final String PAY_TYPE = "微信";private static final String SUCCESS = "SUCCESS";@SuppressWarnings("unchecked")public static final List<NameValuePair> getPayParams(String price,String out_trade_no) throws Exception {String entity = getProductArgs(price, out_trade_no);byte[] buf = HttpClientUtils.getMethodPostBytes(URL1, new StringEntity(entity, AppConfig.DefaultEncoding));String content = new String(buf, AppConfig.DefaultEncoding);Map<String, String> xml = XMLUtil.doXMLParse(content);String prepayId = xml.containsKey(PREPAY_ID) ? xml.get(PREPAY_ID) : "";if (Utils.isNullOrEmpty(prepayId))return null;List<NameValuePair> signParams = new LinkedList<NameValuePair>();signParams.add(new BasicNameValuePair("appid", ConstantUtil.APP_ID));signParams.add(new BasicNameValuePair("noncestr", getNonceStr()));signParams.add(new BasicNameValuePair("package", "Sign=WXPay"));signParams.add(new BasicNameValuePair("partnerid", ConstantUtil.PARTNER));signParams.add(new BasicNameValuePair("prepayid", prepayId));signParams.add(new BasicNameValuePair("timestamp", getTimeStamp()));String sign = getSign(signParams);signParams.add(new BasicNameValuePair("sign", sign));return signParams;}private static String getProductArgs(String price, String out_trade_no) {try {List<NameValuePair> packageParams = new LinkedList<NameValuePair>();packageParams.add(new BasicNameValuePair("appid",ConstantUtil.APP_ID));packageParams.add(new BasicNameValuePair("body", BODY));packageParams.add(new BasicNameValuePair("mch_id",ConstantUtil.PARTNER));packageParams.add(new BasicNameValuePair("nonce_str", getNonceStr()));packageParams.add(new BasicNameValuePair("notify_url",ConstantUtil.NOTIFY_URL));// 写你们的回调地址packageParams.add(new BasicNameValuePair("out_trade_no",out_trade_no));packageParams.add(new BasicNameValuePair("total_fee", (int) (Double.parseDouble(price) * 100) + ""));packageParams.add(new BasicNameValuePair("trade_type", "APP"));String sign = getSign(packageParams);packageParams.add(new BasicNameValuePair("sign", sign));String xmlString = toXml(packageParams);return xmlString;} catch (Exception e) {return null;}}/** * 生成签名 */private static String getSign(List<NameValuePair> params) {StringBuilder sb = new StringBuilder();for (int i = 0; i < params.size(); i++) {sb.append(params.get(i).getName());sb.append('=');sb.append(params.get(i).getValue());sb.append('&');}sb.append("key=");sb.append(ConstantUtil.API_KEY);String packageSign = (Utils.md5(sb.toString()) + "").toUpperCase();return packageSign;}/* * 转换成xml */private static String toXml(List<NameValuePair> params) {StringBuilder sb = new StringBuilder();sb.append("<xml>");for (int i = 0; i < params.size(); i++) {NameValuePair item = params.get(i);String name = item.getName();sb.append("<" + name + ">");sb.append(item.getValue());sb.append("</" + name + ">");}sb.append("</xml>");return sb.toString();}public static String getOpenIdByCode(String code) {try {String url = "https://api.weixin.qq.com/sns/oauth2/access_token?appid="+ ConstantUtil.APP_ID+ "&secret="+ ConstantUtil.APP_SECRET+ "&code="+ code+ "&grant_type=authorization_code";return HttpClientUtils.getMethodGetResponse(url);} catch (Exception e) {return "";}}public static String getUserInfoByOpenId(String openid, String access_token) {try {// String access_token = AccessTokenUtils.getAccessToken();String url = "https://api.weixin.qq.com/sns/userinfo?access_token="+ access_token + "&openid=" + openid;String content = HttpClientUtils.getMethodGetResponse(url);return content;} catch (Exception e) {return "";}}public static String payNofityCallback(Map<String, String> map) {try {if (WechatUtils.checkSign(map)) {String result_code = map.get("result_code");String return_code = map.get("return_code");if (SUCCESS.equals(result_code) && SUCCESS.equals(return_code)) {//NotifyWechat.writeToFile("error5","success");// 付款金额double amount = Integer.parseInt(map.get("total_fee")) / 100.0;// 订单号String out_trade_no = map.get("out_trade_no");// 微信支付订单号String trade_no = map.get("transaction_id");/*做各种处理**/return returnXML(SUCCESS);}} else {}} catch (Exception e) {}return returnXML("FAIL");} private static String returnXML(String return_code) {        return "<xml><return_code><![CDATA["                + return_code                + "]]></return_code><return_msg><![CDATA[OK]]></return_msg></xml>";    }/* 帮助类 start */public static String getNonceStr() {return UUID.randomUUID().toString().replace("-", "").toUpperCase();}public static String getTimeStamp() {return String.valueOf(System.currentTimeMillis() / 1000);}public static String getSign(Map<String, String> map) {List<NameValuePair> list = new ArrayList<NameValuePair>();        SortedMap<String, String> signParams = new TreeMap<String, String>(map);        for (Map.Entry<String, String> stringStringEntry : signParams.entrySet()) {        list.add(new BasicNameValuePair(stringStringEntry.getKey(), stringStringEntry.getValue()));        }        return getSign(list);    }public static boolean checkSign(Map<String, String> map) {String signFromAPIResponse = map.get("sign");if (Utils.isNullOrEmpty(signFromAPIResponse)) {//NotifyWechat.writeToFile("error1", "API返回的数据签名数据不存在,有可能被第三方篡改!!!\r\n"+signFromAPIResponse);return false;}//NotifyWechat.writeToFile("error2", "服务器回包里面的签名是:" + signFromAPIResponse);// 清掉返回数据对象里面的Sign数据(不能把这个数据也加进去进行签名),然后用签名算法进行签名map.remove("sign");String signForAPIResponse = getSign(map);if (!signForAPIResponse.equals(signFromAPIResponse)) {// 签名验不过,表示这个API返回的数据有可能已经被篡改了//NotifyWechat.writeToFile("error3","API返回的数据签名验证不通过,有可能被第三方篡改!!! signForAPIResponse生成的签名为"//+ signForAPIResponse);return false;}//NotifyWechat.writeToFile("error4","恭喜,API返回的数据签名验证通过!!!");return true;}/* 帮助类 end */}
public class ConstantUtil {/** * 商家可以考虑读取配置文件 *///初始化public static String APP_ID = "appid";//微信开发平台应用idpublic static String APP_SECRET = "appsecret";//应用对应的凭证//应用对应的密钥public static String API_KEY = "apikey";public static String PARTNER = "商户号";//财付通商户号public static final String NOTIFY_URL = "notify_url";public static String TOKENURL = "https://api.weixin.qq.com/cgi-bin/token";//获取access_token对应的urlpublic static String GRANT_TYPE = "client_credential";//常量固定值 public static String EXPIRE_ERRCODE = "42001";//access_token失效后请求返回的errcodepublic static String FAIL_ERRCODE = "40001";//重复获取导致上一次获取的access_token失效,返回错误码public static String GATEURL = "https://api.weixin.qq.com/pay/genprepay?access_token=";//获取预支付id的接口urlpublic static String ACCESS_TOKEN = "access_token";//access_token常量值public static String ERRORCODE = "errcode";//用来判断access_token是否失效的值public static String SIGN_METHOD = "sha1";//签名算法常量值}

/** * xml工具类 * @author miklchen * */public class XMLUtil {/** * 解析xml,返回第一级元素键值对。如果第一级元素有子节点,则此节点的值是子节点的xml数据。 * @param strxml * @return * @throws JDOMException * @throws IOException */public static Map doXMLParse(String strxml) throws JDOMException, IOException {strxml = strxml.replaceFirst("encoding=\".*\"", "encoding=\"UTF-8\"");if(null == strxml || "".equals(strxml)) {return null;}Map m = new HashMap();InputStream in = new ByteArrayInputStream(strxml.getBytes("UTF-8"));SAXBuilder builder = new SAXBuilder();Document doc = builder.build(in);Element root = doc.getRootElement();List list = root.getChildren();Iterator it = list.iterator();while(it.hasNext()) {Element e = (Element) it.next();String k = e.getName();String v = "";List children = e.getChildren();if(children.isEmpty()) {v = e.getTextNormalize();} else {v = XMLUtil.getChildrenText(children);}m.put(k, v);}//关闭流in.close();return m;}/** * 获取子结点的xml * @param children * @return String */public static String getChildrenText(List children) {StringBuffer sb = new StringBuffer();if(!children.isEmpty()) {Iterator it = children.iterator();while(it.hasNext()) {Element e = (Element) it.next();String name = e.getName();String value = e.getTextNormalize();List list = e.getChildren();sb.append("<" + name + ">");if(!list.isEmpty()) {sb.append(XMLUtil.getChildrenText(list));}sb.append(value);sb.append("</" + name + ">");}}return sb.toString();}}



阅读全文
0 0
原创粉丝点击