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
- app端微信支付类和JAVA Web 回调类
- java支付宝和微信app支付(服务端处理)
- web app中支付问题
- 微信支付 APP支付 Java 服务器端
- 微信支付 APP支付 Java 服务器端
- 支付宝app支付java服务端
- java支付宝app支付代码
- 支付宝APP支付Java服务端
- java后端配合app前端的支付宝和微信支付(逻辑相关代码)
- Web APP - Java和js交互(web app与native app)
- 支付宝支付(网站支付,APP支付,扫码支付) Java服务端代码
- java微信app支付-支付结果通用通知
- 微信支付app支付服务器端(Java)
- 支付宝APP支付之Java后台生成签名具体步骤
- 支付宝APP支付完成后台回调示例-java
- java服务端–支付宝APP支付接口
- 支付宝APP支付(Java后台生成签名具体步骤)
- java服务端–支付宝APP支付接口
- 那些年、一起追过的Spring--(4)----注解
- Codeforces Round #433 (Div. 2, based on Olympiad of Metropolises)
- 数据挖掘之关联分析一(基本概念)
- Maven War 插件Classes文件夹打为Jar包的Bug与解决方法
- iOS app运行时报错:This application is modifying the autolayout engine from a background thread after the
- app端微信支付类和JAVA Web 回调类
- wamp解决局域网无法访问的403问题
- FileProvider解决FileUriExposedException
- 清华大学2017届本科毕业典礼演讲——做有思想的行者
- 微信小程序之页面拦截器
- CODIS2.x集群 之 存储集群搭建全过程
- 实习总结
- RxJava文章
- freemaker String 常见操作语法