您的位置:首页 > 移动开发 > 微信开发

android微信支付开发流程

2016-06-02 23:47 357 查看
今天做了微信支付,总结一下流程:
 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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  微信 支付 android