微信支付

首先要了解微信支付的交互时序图,统一下单API、支付结果通知API和查询订单API等都涉及签名过程,调用都必须在商户服务器端完成


开发Android APP微信支付功能,需要完成三个步骤:第一步生成预支付订单、第二步生成微信支付参数、第三步调起微信APP支付

统一下单接口返回正常的prepay_id,再按签名规范重新生成签名后,将数据传输给APP。参与签名的字段名为appId,partnerId,prepayId,nonceStr,timeStamp,package。注意:package的值格式为Sign=WXPay

微信支付必备参数:

	// appid
	// 请同时修改 androidmanifest.xml里面,.PayActivityd里的属性<data
	// android:scheme="wxb4ba3c02aa476ea1"/>为新设置的appid
	public static final String APP_ID = "xxxxxxxxxxxxxxxxxxxxxxx";
	// 商户号
	public static final String MCH_ID = "xxxxx";
	// API密钥,在商户平台设置
	public static final String API_KEY = "xxxxxxxxxxxxxxxxxxxxxxx";
在微信开放平台中查看审核通过的APP应用,是否申请支付功能,若已申请,登录微信支付|商户平台: http://pay.weixin.qq.com  查看对应的商户号、API密钥

在你的包名相应目录下新建一个wxapi目录,并在该wxapi目录下新增一个WXEntryActivity类,该类继承自Activity

public class WXPayEntryActivity extends Activity implements IWXAPIEventHandler {

	private IWXAPI api;

	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.pay_result);

		api = WXAPIFactory.createWXAPI(this, Constants.APP_ID);

		api.handleIntent(getIntent(), this);
	}

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

		if (resp.getType() == ConstantsAPI.COMMAND_PAY_BY_WX) {
			
			Toast.makeText(WXPayEntryActivity.this, resp.errStr, Toast.LENGTH_SHORT).show();
			//通知业务类支付结果
			PayActivity.handler.sendEmptyMessage(resp.errCode);
			finish();
		}
	}
}
在AndroidManifest.xml文件中添加如下配置

 <activity
            android:name=".PayActivity"
            android:exported="true"
            android:label="@string/app_name"
            android:launchMode="singleTop" >
            <intent-filter>
                <action android:name="android.intent.action.VIEW" />

                <category android:name="android.intent.category.DEFAULT" />

                <data android:scheme="替换APP_ID" />
            </intent-filter>
        </activity>
        <activity
            android:name=".wxapi.WXPayEntryActivity"
            android:exported="true"
            android:launchMode="singleTop" />

注册APPID

IWXAPI msgApi = WXAPIFactory.createWXAPI(context, null);
msgApi.registerApp(Constants.APP_ID);

调起支付
IWXAPI api;
PayReq request = new PayReq();
request.appId = "wxd930ea5d5a258f4f";
request.partnerId = "1900000109";
request.prepayId= "1101000000140415649af9fc314aa427",;
request.packageValue = "Sign=WXPay";
request.nonceStr= "1101000000140429eb40476f8896f4c9";
request.timeStamp= "1398746574";
request.sign= "7FFECB600D7157C5AA49810D2D8F28BC2811827B";
api.sendReq(req);

支付结果回调

public class PayActivity extends Activity {

	TextView show;
	
	public static Handler handler = new Handler(new Callback() {
		
//		msg.what== 0 :表示支付成功
//		msg.what== -1 :表示支付失败
//		msg.what== -2 :表示取消支付
		@Override
		public boolean handleMessage(Message msg) {
			// TODO Auto-generated method stub
			
			switch (msg.what) {
			case 800://商户订单号重复或生成错误
				
				break;
			case 0://支付成功
				
				break;
			case -1://支付失败
				
				break;
			case -2://取消支付
				
				break;
			default:
				break;
			}
			return false;
		}
	});
}



以下为需要用到的工具类

nonceStr随机数

private String genNonceStr() { 
    Random random = new Random(); 
    return MD5.getMessageDigest(String.valueOf(random.nextInt(10000)) 
        .getBytes()); 
  } 
timeStamp时间戳

private long genTimeStamp() { 
    return System.currentTimeMillis() / 1000; 
  } 

生成APP签名

private String genAppSign(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(Constants.API_KEY); 
  
    this.sb.append("sign str\n" + sb.toString() + "\n\n"); 
    String appSign = MD5.getMessageDigest(sb.toString().getBytes()) 
        .toUpperCase(); 
    Log.e("orion", appSign); 
    return appSign; 
  }
加密算法
public class MD5 {

	private MD5() {}
	
	public final static 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;
			for (int i = 0; i < j; i++) {
				byte byte0 = md[i];
				str[k++] = hexDigits[byte0 >>> 4 & 0xf];
				str[k++] = hexDigits[byte0 & 0xf];
			}
			return new String(str);
		} catch (Exception e) {
			return null;
		}
	}
}





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值