android微信支付开发流程
2016-06-02 23:47
357 查看
今天做了微信支付,总结一下流程:
1.创建一个广播
4.创建WXPay类,用于支付逻辑的设计
**
* Created by xht on 2016/5/5.
* 微信支付的逻辑处理
*/
public class WXPay {
//用户id
private String uid;
//资源id
private String resource_id;
//vip月数
private String vip_mons;
//金额
private String price;
// 请求自己服务器返回的数据
private UserOrder userOrder;
//支付请求类
private PayReq req;
//IWXAPI对象
private IWXAPI msgApi;
// 上下文
private Context context;
private Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
if (msg.what == 1) {
genPayReq(userOrder);
}
}
};
public WXPay(Context context, String uid, String resource_id, String vip_mons, String price) {
this.context = context;
this.uid = uid;
this.resource_id = resource_id;
this.vip_mons = vip_mons;
this.price = price;
//创建PayReq对象
req = new PayReq();
//创建IWXAPI对象
msgApi = WXAPIFactory.createWXAPI(context, null);
//使用app_id注册app
msgApi.registerApp(WXPayConfig.APP_ID);
getUserOrderFromServer();
}
/**
* 向自己服务器请求
* 获得UserOrder对象
* 该对象中封装了prepayId等信息
*/
private void getUserOrderFromServer() {
/**
* 1.把参数放到Map集合中
*/
final Map<String, String> params = new HashMap<String, String>();
params.put("uid", uid);
params.put("resource_id", resource_id);
params.put("vip_mons", vip_mons);
params.put("charge_type", "wx");
params.put("fee", price);
new Thread(new Runnable() {
@Override
public void run() {
try {
/**
* 服务器生成订单 这里发的是post请求
*/
String reusult = httpByPost("http://api.lovek12.com", params, "utf-8");
Log.i("TAG", "微信支付请求服务器返回的数据------result==" + reusult);
Gson gson = new Gson();
userOrder = gson.fromJson(reusult, UserOrder.class);
Message msg = new Message();
msg.what = 1;
handler.sendMessage(msg);
} catch (IOException e) {
e.printStackTrace();
}
}
}).start();
}
public static String httpByPost(String dataurl, Map<String, String> params,
String encoding) throws IOException {
URL url = new URL(dataurl);
HttpURLConnection openConnection = (HttpURLConnection) url
.openConnection();
openConnection.setConnectTimeout(5000);
openConnection.setReadTimeout(5000);
openConnection.setRequestProperty("charset", encoding);
openConnection.setRequestMethod("POST");
if (params != null) {
openConnection.setDoOutput(true);
StringBuffer stringbuffer = new StringBuffer();
// 遍历Map集合拼接实体参数
Set<Map.Entry<String, String>> entrySet = params.entrySet();
for (Map.Entry<String, String> entry : entrySet) {
stringbuffer.append(entry.getKey()).append("=")
.append(entry.getValue()).append("&");
}
stringbuffer.deleteCharAt(stringbuffer.length() - 1);
OutputStream outputStream = openConnection.getOutputStream();
outputStream.write(stringbuffer.toString().getBytes());
}
if (openConnection.getResponseCode() == 200) {
InputStream inputStream = openConnection.getInputStream();
return read(inputStream, encoding);
}
return null;
}
private static String read(InputStream inputStream, String encoding) throws IOException {
ByteArrayOutputStream bo = new ByteArrayOutputStream();
int len = 0;
byte[] buf = new byte[1024];
while ((len = inputStream.read(buf)) != -1) {
bo.write(buf, 0, len);
}
bo.flush();
bo.close();
return new String(bo.toByteArray(), encoding);
}
/**
* 先做签名
*
* @param order
*/
private void genPayReq(UserOrder order) {
req.appId = WXPayConfig.APP_ID;
req.partnerId = WXPayConfig.MCH_ID;
req.prepayId = order.data.prepay_id;
req.packageValue = "Sign=WXPay";
req.nonceStr = genNonceStr();
req.timeStamp = String.valueOf(genTimeStamp());
@SuppressWarnings("deprecation")
List<NameValuePair> signParams = new LinkedList<NameValuePair>();
signParams.add(new BasicNameValuePair("appid", req.appId));
signParams.add(new BasicNameValuePair("noncestr", req.nonceStr));
signParams.add(new BasicNameValuePair("package", req.packageValue));
signParams.add(new BasicNameValuePair("partnerid", req.partnerId));
signParams.add(new BasicNameValuePair("prepayid", req.prepayId));
signParams.add(new BasicNameValuePair("timestamp", req.timeStamp));
req.sign = genAppSign(signParams);
Log.e("orion", signParams.toString());
msgApi.sendReq(req);
}
/**
* 在app端生成签名
*
* @param params
* @return
*/
private String genAppSign(List<NameValuePair> params) {
StringBuilder str = new StringBuilder();
for (int i = 0; i < params.size(); i++) {
str.append(params.get(i).getName());
str.append('=');
str.append(params.get(i).getValue());
str.append('&');
}
str.append("key=");
str.append(WXPayConfig.API_KEY);
String appSign = MD5.getMessageDigest(str.toString().getBytes()).toUpperCase();
Log.e("orion", appSign);
return appSign;
}
private String genNonceStr() {
Random random = new Random();
return MD5.getMessageDigest(String.valueOf(random.nextInt(10000)).getBytes());
}
// 生成当前时间
private long genTimeStamp() {
return System.currentTimeMillis() / 1000;
}
}
github地址:https://github.com/zhouwei5200/WXPay
1.创建一个广播
public class AppRegister extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { final IWXAPI msgApi = WXAPIFactory.createWXAPI(context, null); // 将该app注册到微信 msgApi.registerApp(WXPayConfig.APP_ID); } }2.在包名下创建wxapi包,创建WXPayEntryActivity类,用于接收微信支付结果的回调
public class WXPayEntryActivity extends Activity implements IWXAPIEventHandler, View.OnClickListener { // 标题栏返回箭头 private ImageView iv_wx_pay_callback_back; private IWXAPI api; @Override protected void onNewIntent(Intent intent) { super.onNewIntent(intent); setIntent(intent); api.handleIntent(intent, this); } @Override public void onReq(BaseReq req) { } @Override public void onResp(BaseResp resp) { Log.d("TAG", "onPayFinish, errCode = " + resp.errCode); /** * 0表示支付成功,-1表示支付终端,-2表示支付失败 */ if (resp.getType() == ConstantsAPI.COMMAND_PAY_BY_WX) { AlertDialog.Builder builder = new AlertDialog.Builder(this); builder.setTitle("提示"); builder.setMessage("微信支付结果:" + String.valueOf(resp.errCode)); builder.show(); } }3.在清单文件中配置
<!--支付宝支付--> <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> <uses-permission android:name="android.permission.READ_PHONE_STATE" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:supportsRtl="true" android:theme="@style/AppTheme"> <activity android:name=".MainActivity"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <!--微信支付回调页面--> <activity android:name=".wxapi.WXPayEntryActivity" android:exported="true" android:launchMode="singleTop"></activity> <receiver android:name=".wxpay.AppRegister"> <intent-filter> <action android:name="com.tencent.mm.plugin.openapi.Intent.ACTION_REFRESH_WXAPP" /> </intent-filter> </receiver>
4.创建WXPay类,用于支付逻辑的设计
**
* Created by xht on 2016/5/5.
* 微信支付的逻辑处理
*/
public class WXPay {
//用户id
private String uid;
//资源id
private String resource_id;
//vip月数
private String vip_mons;
//金额
private String price;
// 请求自己服务器返回的数据
private UserOrder userOrder;
//支付请求类
private PayReq req;
//IWXAPI对象
private IWXAPI msgApi;
// 上下文
private Context context;
private Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
if (msg.what == 1) {
genPayReq(userOrder);
}
}
};
public WXPay(Context context, String uid, String resource_id, String vip_mons, String price) {
this.context = context;
this.uid = uid;
this.resource_id = resource_id;
this.vip_mons = vip_mons;
this.price = price;
//创建PayReq对象
req = new PayReq();
//创建IWXAPI对象
msgApi = WXAPIFactory.createWXAPI(context, null);
//使用app_id注册app
msgApi.registerApp(WXPayConfig.APP_ID);
getUserOrderFromServer();
}
/**
* 向自己服务器请求
* 获得UserOrder对象
* 该对象中封装了prepayId等信息
*/
private void getUserOrderFromServer() {
/**
* 1.把参数放到Map集合中
*/
final Map<String, String> params = new HashMap<String, String>();
params.put("uid", uid);
params.put("resource_id", resource_id);
params.put("vip_mons", vip_mons);
params.put("charge_type", "wx");
params.put("fee", price);
new Thread(new Runnable() {
@Override
public void run() {
try {
/**
* 服务器生成订单 这里发的是post请求
*/
String reusult = httpByPost("http://api.lovek12.com", params, "utf-8");
Log.i("TAG", "微信支付请求服务器返回的数据------result==" + reusult);
Gson gson = new Gson();
userOrder = gson.fromJson(reusult, UserOrder.class);
Message msg = new Message();
msg.what = 1;
handler.sendMessage(msg);
} catch (IOException e) {
e.printStackTrace();
}
}
}).start();
}
public static String httpByPost(String dataurl, Map<String, String> params,
String encoding) throws IOException {
URL url = new URL(dataurl);
HttpURLConnection openConnection = (HttpURLConnection) url
.openConnection();
openConnection.setConnectTimeout(5000);
openConnection.setReadTimeout(5000);
openConnection.setRequestProperty("charset", encoding);
openConnection.setRequestMethod("POST");
if (params != null) {
openConnection.setDoOutput(true);
StringBuffer stringbuffer = new StringBuffer();
// 遍历Map集合拼接实体参数
Set<Map.Entry<String, String>> entrySet = params.entrySet();
for (Map.Entry<String, String> entry : entrySet) {
stringbuffer.append(entry.getKey()).append("=")
.append(entry.getValue()).append("&");
}
stringbuffer.deleteCharAt(stringbuffer.length() - 1);
OutputStream outputStream = openConnection.getOutputStream();
outputStream.write(stringbuffer.toString().getBytes());
}
if (openConnection.getResponseCode() == 200) {
InputStream inputStream = openConnection.getInputStream();
return read(inputStream, encoding);
}
return null;
}
private static String read(InputStream inputStream, String encoding) throws IOException {
ByteArrayOutputStream bo = new ByteArrayOutputStream();
int len = 0;
byte[] buf = new byte[1024];
while ((len = inputStream.read(buf)) != -1) {
bo.write(buf, 0, len);
}
bo.flush();
bo.close();
return new String(bo.toByteArray(), encoding);
}
/**
* 先做签名
*
* @param order
*/
private void genPayReq(UserOrder order) {
req.appId = WXPayConfig.APP_ID;
req.partnerId = WXPayConfig.MCH_ID;
req.prepayId = order.data.prepay_id;
req.packageValue = "Sign=WXPay";
req.nonceStr = genNonceStr();
req.timeStamp = String.valueOf(genTimeStamp());
@SuppressWarnings("deprecation")
List<NameValuePair> signParams = new LinkedList<NameValuePair>();
signParams.add(new BasicNameValuePair("appid", req.appId));
signParams.add(new BasicNameValuePair("noncestr", req.nonceStr));
signParams.add(new BasicNameValuePair("package", req.packageValue));
signParams.add(new BasicNameValuePair("partnerid", req.partnerId));
signParams.add(new BasicNameValuePair("prepayid", req.prepayId));
signParams.add(new BasicNameValuePair("timestamp", req.timeStamp));
req.sign = genAppSign(signParams);
Log.e("orion", signParams.toString());
msgApi.sendReq(req);
}
/**
* 在app端生成签名
*
* @param params
* @return
*/
private String genAppSign(List<NameValuePair> params) {
StringBuilder str = new StringBuilder();
for (int i = 0; i < params.size(); i++) {
str.append(params.get(i).getName());
str.append('=');
str.append(params.get(i).getValue());
str.append('&');
}
str.append("key=");
str.append(WXPayConfig.API_KEY);
String appSign = MD5.getMessageDigest(str.toString().getBytes()).toUpperCase();
Log.e("orion", appSign);
return appSign;
}
private String genNonceStr() {
Random random = new Random();
return MD5.getMessageDigest(String.valueOf(random.nextInt(10000)).getBytes());
}
// 生成当前时间
private long genTimeStamp() {
return System.currentTimeMillis() / 1000;
}
}
github地址:https://github.com/zhouwei5200/WXPay
相关文章推荐
- 社交巨头三国杀:微信、WhatsApp、Line到底有啥区别?
- 使用C++实现JNI接口需要注意的事项
- Android IPC进程间通讯机制
- Android Manifest 用法
- [转载]Activity中ConfigChanges属性的用法
- Android之获取手机上的图片和视频缩略图thumbnails
- Android之使用Http协议实现文件上传功能
- Android学习笔记(二九):嵌入浏览器
- android string.xml文件中的整型和string型代替
- i-jetty环境搭配与编译
- android之定时器AlarmManager
- android wifi 无线调试
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- android 代码实现控件之间的间距
- android FragmentPagerAdapter的“标准”配置
- Android"解决"onTouch和onClick的冲突问题
- android:installLocation简析
- android searchView的关闭事件