Android 集成微信支付,Android自学

private String mobile;

private String adress;

private int count;

@ViewInject(R.id.product_ordsubmit_username)

private TextView usernameTV;

@ViewInject(R.id.product_ordsubmit_phone)

private TextView phoneTV;

@ViewInject(R.id.product_ordsubmit_adress)

private TextView adressTV;

@ViewInject(R.id.product_ordsubmit_desc)

private TextView descTV;

@ViewInject(R.id.product_ordsubmit_price)

private TextView priceTV;

@ViewInject(R.id.product_ordsubmit_intg)

private TextView intgTV;

@ViewInject(R.id.product_ordsubmit_count1)

private TextView countTV1;

@ViewInject(R.id.product_ordsubmit_count)

private TextView countTV;

@ViewInject(R.id.product_ordsubmit_intgtotal1)

private TextView intgtotal1TV;

@ViewInject(R.id.product_ordsubmit_intgtotal2)

private TextView intgtotal2TV;

@ViewInject(R.id.product_ordsubmit_pricetotal1)

private TextView pricetotal1TV;

@ViewInject(R.id.product_ordsubmit_pricetotal2)

private TextView pricetotal2TV;

@ViewInject(R.id.product_ordsubmit_counttotal)

private TextView counttotalTV;

@ViewInject(R.id.product_ordsubmit_ok)

private Button okBtn;

@ViewInject(R.id.product_ordsubmit_say_et)

private TextView sayEt;

@ViewInject(R.id.product_ordsubmit_img)

private ImageView img;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

ViewUtils.inject(this);

goods = new Goods();

goods.costprice=100;

goods.productid=692356222;

goods.producttypeid=11;

goods.productname=“测试商品”;

goods.discountprice=0.01;

goods.productdescription=“商品描述”;

goods.companydesc=“测试商户简单描述”;

goods.comanyadress=“商户地址未知”;

goods.companyname=“测试商户”;

goods.score=1;

goods.status=1;

goods.stock=300;

count=1;

initData();

initView();

}

private void initData() {

username =“客户名称”;

mobile = “13800380038”;

adress=“客户地址”;

}

private void initView() {

usernameTV.setText(“收货人:”+username);

phoneTV.setText(mobile+"");

adressTV.setText(adress);

descTV.setText(goods.productdescription);

priceTV.setText(“¥”+goods.discountprice);

intgTV.setText(“积分:”+goods.score);

countTV1.setText(“X”+count);

countTV.setText(count+"");

intgtotal1TV.setText(“共得到”+count*goods.score+“积分”);

intgtotal2TV.setText(“积分:”+count*goods.score);

counttotalTV.setText(“共”+count+“件”);

pricetotal1TV.setText(“¥”+Arith.mul(goods.discountprice, count));

pricetotal2TV.setText(“¥”+Arith.mul(goods.discountprice, count));

//ImageLoader.getInstance().displayImage(goods.pic1, img);

}

/**

  • 增加数量

  • @param v

*/

@OnClick(R.id.product_ordsubmit_count_add)

《Android学习笔记总结+最新移动架构视频+大厂安卓面试真题+项目实战源码讲义》

【docs.qq.com/doc/DSkNLaERkbnFoS0ZF】 完整内容开源分享

public void add(View v) {

count++;

countTV1.setText(“X”+count);

countTV.setText(count+"");

intgtotal1TV.setText(“共得到”+count*goods.score+“积分”);

intgtotal2TV.setText(“积分:”+count*goods.score);

counttotalTV.setText(“共”+count+“件”);

pricetotal1TV.setText(“¥”+Arith.mul(goods.discountprice, count));

pricetotal2TV.setText(“¥”+Arith.mul(goods.discountprice, count));

}

/**

  • 减少数量

  • @param v

*/

@OnClick(R.id.product_ordsubmit_count_sub)

public void sub(View v) {

if (count>1) {

count–;

countTV1.setText(“X”+count);

countTV.setText(count+"");

intgtotal1TV.setText(“共得到”+count*goods.score+“积分”);

intgtotal2TV.setText(“积分:”+count*goods.score);

counttotalTV.setText(“共”+count+“件”);

pricetotal1TV.setText(“¥”+Arith.mul(goods.discountprice, count));

pricetotal2TV.setText(“¥”+Arith.mul(goods.discountprice, count));

}

}

/**

  • 提交订单

  • @param v

*/

@OnClick(R.id.product_ordsubmit_ok)

public void submit(View v) {

final OrderInfo orderInfo=new OrderInfo();

orderInfo.userid=13752;

orderInfo.areacode=23;

orderInfo.buildno=“10”;

orderInfo.roomno=“1001”;

orderInfo.producttypeid=goods.producttypeid;

orderInfo.productid=goods.productid;

orderInfo.amount=goods.discountprice;//单价

orderInfo.account=count;//数量

orderInfo.totalamount=Arith.mul(goods.discountprice, count);

//double offsetamount;//抵扣金额

orderInfo.score=count*goods.score;

//int assessitem;//评价项

//int assesslevel;//评价级别

//String assesscontent;//评价内容

//long payid=;//支付编号

orderInfo.status=2;//支付状态待付款

orderInfo.type=11;//日用品

orderInfo.usermemo =sayEt.getText().toString();//业主备注

orderInfo.address =adress;

orderInfo.productname =goods.productname;//

orderInfo.desccontext =goods.productdescription;//

orderInfo.outtradeno=System.currentTimeMillis()+""+orderInfo.userid;

orderInfo.merchantid=goods.companyid;

submitorder(orderInfo);

}

/**

  • 订单提交成功,进入付款界面

  • @param orderInfo

  • @return

*/

private void submitorder(OrderInfo orderInfo) {

Intent intent=new Intent(this, SelectPayTypeActivity.class);

intent.putExtra(“data”, orderInfo);

startActivity(intent);

}

}

(2)在mainactivty中点击确认按钮调用支付方式选择页面SelectPayTypeActivity,用来发起支付选择。

(3)根据支付方式调用对应工具类微信(WXpayUtil)

public class WXpayUtil {

private IWXAPI api;

private OrderInfo order;

private Context context;

private PayReq req;

private Map<string,string> resultunifiedorder;

private static final String TAG = “ewuye.online.SelectPayTypeActivity”;

public WXpayUtil(Context mcontext,OrderInfo order){

//初始化微信支付

this.order=order;

this.context=mcontext;

if (TextUtils.isEmpty(ParameterConfig.WX_APP_ID) || TextUtils.isEmpty(ParameterConfig.WX_MCH_ID) || TextUtils.isEmpty(ParameterConfig.WX_API_KEY)) {

new AlertDialog.Builder(context).setTitle(“警告”).setMessage(“需要配置WX_APP_ID | WX_MCH_ID| WX_API_KEY\n请到ParameterConfig.java里配置”)

.setPositiveButton(“确定”, new DialogInterface.OnClickListener() {

public void onClick(DialogInterface dialoginterface, int i) {

//

((Activity)context).finish();

}

}).show();

return;

}

api = WXAPIFactory.createWXAPI(context, null);

req = new PayReq();

//生成prepay_id

GetPrepayIdTask getPrepayId = new GetPrepayIdTask();

getPrepayId.execute();

}

/**

  • 用于获取

  • @author 95

*/

private class GetPrepayIdTask extends AsyncTask<void, string="">> {

private ProgressDialog dialog;

@Override

protected void onPreExecute() {

dialog = ProgressDialog.show(context, “提示”, “正在获取预支付订单…”);

}

@Override

protected void onPostExecute(Map<string,string> result) {

if (dialog != null) {

dialog.dismiss();

}

resultunifiedorder=result;

genPayReq();

}

@Override

protected void onCancelled() {

super.onCancelled();

}

@Override

protected Map<string,string> doInBackground(Void… params) {

String url = String.format(“https://api.mch.weixin.qq.com/pay/unifiedorder”);

String entity = genProductArgs();

Log.e(“orion”,entity);

byte[] buf = httpPost(url, entity);

String content = new String(buf);

Log.e(“orion”, content);

Map<string,string> xml=decodeXml(content);

return xml;

}

}

private void genPayReq() {

req.appId = ParameterConfig.WX_APP_ID;

req.partnerId = ParameterConfig.WX_MCH_ID;

req.prepayId = resultunifiedorder.get(“prepay_id”);

req.packageValue = “prepay_id=”+resultunifiedorder.get(“prepay_id”);

req.nonceStr = genNonceStr();

req.timeStamp = String.valueOf(genTimeStamp());

List signParams = new LinkedList();

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());

sendPayReq();

}

private void sendPayReq() {

api.registerApp(ParameterConfig.WX_APP_ID);

api.sendReq(req);

}

private String genProductArgs() {

StringBuffer xml = new StringBuffer();

try {

String nonceStr = genNonceStr();

xml.append("");

List packageParams = new LinkedList();

packageParams.add(new BasicNameValuePair(“appid”, ParameterConfig.WX_APP_ID));

packageParams.add(new BasicNameValuePair(“body”, order.productname));

packageParams.add(new BasicNameValuePair(“mch_id”, ParameterConfig.WX_MCH_ID));

packageParams.add(new BasicNameValuePair(“nonce_str”, nonceStr));

packageParams.add(new BasicNameValuePair(“notify_url”, ParameterConfig.WX_notifyUrl));

packageParams.add(new BasicNameValuePair(“out_trade_no”,genOutTradNo()));

packageParams.add(new BasicNameValuePair(“spbill_create_ip”,“127.0.0.1”));

packageParams.add(new BasicNameValuePair(“total_fee”, (int)(order.totalamount*100)+""));

packageParams.add(new BasicNameValuePair(“trade_type”, “APP”));

String sign = genPackageSign(packageParams);

packageParams.add(new BasicNameValuePair(“sign”, sign));

String xmlstring =toXml(packageParams);

return new String(xmlstring.toString().getBytes(), “ISO8859-1”);

//return xmlstring;

} catch (Exception e) {

Log.e(TAG, "genProductArgs fail, ex = " + e.getMessage());

return null;

}

}

private String genAppSign(List 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(ParameterConfig.WX_API_KEY);

String appSign = getMessageDigest(sb.toString().getBytes());

Log.e(“orion”,appSign);

return appSign;

}

private HttpClient getNewHttpClient() {

try {

KeyStore trustStore = KeyStore.getInstance(KeyStore.getDefaultType());

trustStore.load(null, null);

SSLSocketFactory sf = new SSLSocketFactoryEx(trustStore);

sf.setHostnameVerifier(SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);

HttpParams params = new BasicHttpParams();

HttpProtocolParams.setVersion(params, HttpVersion.HTTP_1_1);

HttpProtocolParams.setContentCharset(params, HTTP.UTF_8);

SchemeRegistry registry = new SchemeRegistry();

registry.register(new Scheme(“http”, PlainSocketFactory.getSocketFactory(), 80));

registry.register(new Scheme(“https”, sf, 443));

ClientConnectionManager ccm = new ThreadSafeClientConnManager(params, registry);

return new DefaultHttpClient(ccm, params);

} catch (Exception e) {

return new DefaultHttpClient();

}

}

private class SSLSocketFactoryEx extends SSLSocketFactory {

SSLContext sslContext = SSLContext.getInstance(“TLS”);

public SSLSocketFactoryEx(KeyStore truststore) throws NoSuchAlgorithmException, KeyManagementException, KeyStoreException, UnrecoverableKeyException {

super(truststore);

TrustManager tm = new X509TrustManager() {

public X509Certificate[] getAcceptedIssuers() {

return null;

}

@Override

public void checkClientTrusted(X509Certificate[] chain, String authType) throws java.security.cert.CertificateException {

}

@Override

public void checkServerTrusted(X509Certificate[] chain, String authType) throws java.security.cert.CertificateException {

}

};

sslContext.init(null, new TrustManager[] { tm }, null);

}

@Override

public Socket createSocket(Socket socket, String host, int port, boolean autoClose) throws IOException, UnknownHostException {

return sslContext.getSocketFactory().createSocket(socket, host, port, autoClose);

}

@Override

public Socket createSocket() throws IOException {

return sslContext.getSocketFactory().createSocket();

}

}

public byte[] httpPost(String url, String entity) {

if (url == null || url.length() == 0) {

Log.e(TAG, “httpPost, url is null”);

return null;

}

HttpClient httpClient = getNewHttpClient();

HttpPost httpPost = new HttpPost(url);

try {

httpPost.setEntity(new StringEntity(entity));

httpPost.setHeader(“Accept”, “application/json”);

httpPost.setHeader(“Content-type”, “application/json”);

HttpResponse resp = httpClient.execute(httpPost);

if (resp.getStatusLine().getStatusCode() != HttpStatus.SC_OK) {

Log.e(TAG, "httpGet fail, status code = " + resp.getStatusLine().getStatusCode());

return null;

}

return EntityUtils.toByteArray(resp.getEntity());

} catch (Exception e) {

Log.e(TAG, "httpPost exception, e = " + e.getMessage());

e.printStackTrace();

return null;

}

}

private String genOutTradNo() {

Random random = new Random();

return getMessageDigest(String.valueOf(random.nextInt(10000)).getBytes());

}

public Map<string,string> decodeXml(String content) {

try {

Map<string, string=""> xml = new HashMap<string, string="">();

XmlPullParser parser = Xml.newPullParser();

parser.setInput(new StringReader(content));

int event = parser.getEventType();

while (event != XmlPullParser.END_DOCUMENT) {

String nodeName=parser.getName();

switch (event) {

case XmlPullParser.START_DOCUMENT:

break;

case XmlPullParser.START_TAG:

if(“xml”.equals(nodeName)==false){

//实例化student对象

xml.put(nodeName,parser.nextText());

}

break;

case XmlPullParser.END_TAG:

break;

}

event = parser.next();

}

return xml;

} catch (Exception e) {

Log.e(“orion”,e.toString());

}

return null;

}

private String genNonceStr() {

Random random = new Random();

return getMessageDigest(String.valueOf(random.nextInt(10000)).getBytes());

}

private long genTimeStamp() {

return System.currentTimeMillis() / 1000;

}

public String getMessageDigest(byte[] buffer) {

char hexDigits[] = { ‘0’, ‘1’, ‘2’, ‘3’, ‘4’, ‘5’, ‘6’, ‘7’, ‘8’, ‘9’, ‘a’, ‘b’, ‘c’, ‘d’, ‘e’, ‘f’ };

try {

MessageDigest mdTemp = MessageDigest.getInstance(“MD5”);

mdTemp.update(buffer);

byte[] md = mdTemp.digest();

int j = md.length;

char str[] = new char[j * 2];

int k = 0;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值